**process fatigue_rainflow#

Description#

This command is used in replacement of **process fatigue_S for rainflow counting evaluations of fatigue life. Considering the complex load sequence of the next figure:

../../_images/fatigue_rainflow.svg

for each elementary cycle detected by the multiaxial rainflow algorithm (**process multirange, see multirange ), a number of cycle to failure \(N_{fi}\) is calculated using the Chaboche fatigue stress-based model:

(131)#\[N_{fi} ~=~ \frac{ \left< \sigma_u - \sigma^{max}_i \right> } { a~(\beta+1)~ \left< \sigma^a_i-\sigma_l(\bar{\sigma}_i) \right> } ~\left[ \frac{\sigma^a_i}{M(\bar{\sigma}_i)} \right]^{-\beta}\]

where \(<.>\) denotes the positive part operator, \(\sigma^a_i=\frac{\Delta \sigma_i}{2}\) the amplitude, \(\bar{\sigma}_i\) the mean, and \(\sigma^{max}_i\) the maximum value of the stress path for the current elementary cycle. The previous scalar quantities are computed in the following way from the multi-axial stress path:

  • the stress amplitude \(\sigma^a_i\) of an arbitrary multiaxial stress path is computed by **process multirange,

  • the mean stress \(\bar{\sigma}_i\) is defined as the mean trace of tensor \(\overline{\sigma}\)

    (132)#\[\bar{\sigma}_i = \frac{1}{2} \left[ ~\displaystyle \max_{cycle~ i} \left\{ tra(\overline{\sigma}) \right\} ~+~ \displaystyle \min_{cycle~i} \left\{ tra(\overline{\sigma}) \right\} ~\right]\]
  • the maximum stress \(\sigma^{max}_i\) is the maximum value of either the greatest principal stress (default mode) or the mises invariant (*use_mises option) of stress tensor \(\overline{\sigma}\) for the current elementary cycle.

To account for the mean stress dependence of \(N_{fi}\), coefficients \(\sigma_l(\bar{\sigma}_i)\) (fatigue limit) and \(M(\bar{\sigma}_i)\) may depend on \(\bar{\sigma}_i\) according the following expressions:

  • mode *mean_stress default:

    (133)#\[\sigma_l(\bar{\sigma}_i)~=~\sigma_{l0}~\left(1-b_1~\bar{\sigma}_i\right)~~~,~~~M(\bar{\sigma}_i)~=~M_0~\left(1-b_2~\bar{\sigma}_i\right)\]
  • mode *mean_stress variant:

    (134)#\[\sigma_l(\bar{\sigma}_i)~=~\frac{\sigma_{l0}}{1~+~b_1~<\bar{\sigma}_i>}~~~,~~~M(\bar{\sigma}_i)~=~\frac{M_0}{1+b_2~<\bar{\sigma}_i>}\]
  • mode *mean_stress tos:

    (135)#\[\sigma_l(\bar{\sigma}_i)~=~\sigma_{l0}~\left(\frac{1}{1+b_1~\frac{\bar{\sigma}_i}{\sigma^a_i}}\right)~~~,~~~ M(\bar{\sigma}_i)~=~M_0~\left(\frac{1}{1~+~b_2~\frac{\bar{\sigma}_i}{\sigma^a_i}}\right)~~~,~~~\]

variant is now preferred to the legacy default mode, because in the latter case, large mean stress \(\bar{\sigma}_i\) may give rise to negative \(M(\bar{\sigma}_i)\) values, leading to an indefinite value of \(N_f\) in equation (1) (in this case the program will return \(N_f=1\)).

Anisothermal case and coefficients temperature dependence#

When the temperature is changing during the cycle, it is customary to use a normalized \(\overline{s}(t)\) stress values, defined in the following way:

(136)#\[\overline{s}(t)~=~\frac{1}{\sigma_n(T(t))}~\overline{\sigma}(t)\]

where \((\overline{\sigma}(t),T(t))\) are the stress/temperature values stored in the results file for the current output time \(t\), and \(\sigma_n\) is a temperature-dependent normalization coefficient defined in the material file. Note that defining \(\sigma_n\) is in fact optional, since when \(\sigma_n\) is not explicitly declared, the UTS \(\sigma_u\) coefficient is automatically used to normalize the stress input.

In most cases, using this normalization procedure, all fatigue points obtained at different temperatures may be gathered on a single master Woehler curve, as represented on the next figure.

../../_images/fat_aniso.svg

All model coefficients (except \(\sigma_n\) or \(\sigma_u\)) may then be given as temperature-independent constant values. Note that in this case the *normalized_coef option is mandatory, and that values expected for coefficients \(M\), \(\sigma_l\), \(b1\) and \(b2\) should be modified accordingly to correspond to a normalized stress input, ie. the standard values should be:

  • divided by \(\sigma_n\) (coefficients \(\sigma_l\), \(M\))

  • multiplied by \(\sigma_n\) (coefficients \(b_1\), \(b_2\))

However, if fatigue data at different temperature exhibits too much scatter on such a normalized representation, it may be necessary to define temperature dependence for the remaining coefficients \(M\), \(\beta\), \(a\), \(b_1\) and \(b_2\).

In this case, a direct computation of \(N_f\) by equation (1) is not possible, because coefficients no longer have a constant value for the whole cycle. A special Taira procedure is then applied to compute a temperature \(T^*\) (the so-called equivalent temperature), and coefficient values are evaluated at this particular temperature:

(137)#\[N_{fi} ~=~ \frac{ \left< \sigma_u(T^*) - s^{max}_i \right> } { a(T^*)~(\beta(T^*)+1)~ \left< s^a_i-\sigma_l(T^*,\bar{s}_i) \right> } ~\left[ \frac{s^a_i}{M(T^*,\bar{s}_i)} \right]^{-\beta(T^*)}\]

where stress \(\sigma\) is replaced by the corresponding normalized value noted \(s\) in equation (2).

To calculate this equivalent temperature \(T^*\), a fatigue incremental model, corresponding to a simplified version of equation (1), is first introduced hereafter:
(138)#\[ \dot{D}^*~=~\frac{\beta^*}{4~B^*}~\left(\frac{J\left(\overline{s}-\overline{X}\right)}{M^*}\right)^{\beta^*-1} J\left(\overline{\dot{s}}\right)\]

where \(J(.)\) denotes the von mises invariant, \(\overline{s}(t)~=~\frac{1}{\sigma_n(T(t))}~\overline{\sigma}(t)\) the normalized stress tensor defined above, and \(\overline{X}\) the center of the normalized loading path \(\left\{ \overline{s}(t_i) \right\}\) (also an output of **process multirange). Integration of equation (3) on an isothermal symmetric cycle (\(R=-1\)), gives the following expression for the total damage \(D^*\), and the corresponding number of cycles to failure \(N_f^*=\frac{1}{D^*}\):

(139)#\[ N_f^*~=~\frac{1}{D^*}~=~\left(\frac{s^a}{M^*}\right)^{-\beta^*}\]

It can be checked that equation (4) is indeed a simplified version of (1), where both asymptotes (\(\sigma^{max}>\sigma_u\) and \(\sigma^a<\sigma_l\)) are removed. Coefficients \(M^*\) and \(\beta^*\) in (3,4) are chosen such as to give the same damage as the one obtained for the full model (1) at a mid point on the Woehler curve, ie. for a stress amplitude \(\sigma^a=\frac{\sigma_l+\sigma_u}{2}\). This condition defines the following relationship between coefficients (\(M^*\),\(\beta^*\)) of the simplified model, and coefficients (\(M\),\(\beta\),\(a\),\(\sigma_u\),\(\sigma_l\)) of the full expression (1):


(140)#\[\beta^*~=~\beta~+~\frac{\sigma_u+\sigma_l}{\sigma_u-\sigma_l}~~~~,~~~~ M^*~=~\left(a(\beta+1)\right)^{-\frac{1}{\beta^*}}~\left(\frac{\sigma_u+\sigma_l}{2}\right)^{1-\frac{\beta}{\beta^*}}~M_0^{\frac{\beta}{\beta^*}}\]

\(T^*\) is then defined as the temperature giving the same damage on an isothermal test performed at temperature \(T^*\), as the one obtained on the initial anisothermal loading (according to the incremental model of equation 3):

(141)#\[\begin{split} \begin{aligned} T^*~~ such~that~~ \displaystyle\int_{cycle} \frac{\beta^*(T^*)}{4~B^*(T^*)}~\left(\frac{J\left(\overline{s}(t)-\overline{X}\right)}{M^*(T^*)}\right)^{\beta^*(T^*)-1} J\left(\overline{\dot{s}}(t)\right)~dt ~=~\nonumber \\ \displaystyle\int_{cycle} \frac{\beta^*(T(t))}{4~B^*(T(t))}~\left(\frac{J\left(\overline{s}(t)-\overline{X}\right)}{M^*(T(t))}\right)^{\beta^*(T(t))-1} J\left(\overline{\dot{s}}(t)\right)~dt \end{aligned}\end{split}\]

For complex anisothermal loadings, where coefficients depend on temperature, the non-linear equation (6) is then solved to compute \(T^*\), before calculation of \(N_f\) using equation (2), where \(M_0\), \(\beta\), \(a\), \(b1\), \(b2\) values are taken at temperature \(T=T^*\).

Out of phase correction#

The stress amplitude \(\sigma^a\) (or \(s^a\) in the normalized case) in equation (1) is computed as the radius of the smallest hypershere containing all multiaxial stress points \(\overline{\sigma}(t)\) for the current elementary cycle. This radius is the same for proportional, out-of-phase, or even completely random variations of tensor components during the cycle. Consequently, according to the model, there is no decrease of \(N_f\) for out of phase loadings, a result in contradiction with experiments.

A dedicated option has been implemented to correct this problem (option *out_of_phase). The method uses again the simplified incremental model defined by equation (3). A corrected stress amplitude \(\frac{\Delta s^*}{2}\), that accounts for out-of-phase effects, is thus defined as the one corresponding to the integration of equation (3):

(142)#\[\left(\frac{\frac{\Delta s^*}{2}}{M^*}\right)^{-\beta^*}~=~ \displaystyle\int_{cycle} \frac{\beta^*}{4~B^*}~\left(\frac{J\left(\overline{s}(t)-\overline{X}\right)}{M^*}\right)^{\beta^*-1} J\left(\overline{\dot{s}}(t)\right)~dt\]

Equation (7) defines the amplification factor \(f\) (\(f=\frac{\Delta s^*}{\Delta s}>1\)) applied to the stress-amplitude. This correction will result in a decrease of the number of cycles to failure in case of strongly out of phase loadings.

Syntax#

**process fatigue_rainflow \(~\,\) *var name [ *type scalar | tensor ] [ *reverse cmax ] [ *mode with_a | simple ] [ *use_mises ] [ *mean_stress ( standard | variant | tos ) ] [ *normalized_coeff ] [ *out_of_phase ] [ *infinity_is infty ] [ *scale lin | log ]

*var name

is the name of the stress component used in the fatigue damage equation. This component may be a tensor (eg. sig) or a simple scalar quantity (eg. uniaxial stress values, read from an ASCII file, using the ***data_source ASCII command)

*type

this optional command allows to specify the type (tensor or scalar) of the stress component (default is tensor)

*reverse

as described above, the post-processor first decomposes the input stress path in elementary cycles using a multi-axial rainflow procedure. Then, the number of cycles to failure NFi associated to each elementary cycle is computed, even if only the cmax most damaging cycles are stored in the results files (default value is cmax=3)

*mode

coefficient a in the fatigue equation (1) is mainly used for non-linear cumulation with the NLC_ONERA option (cf. *process onera at page ), but may be skipped to compute the number of cycles to failure. This strategy is activated when *mode simple is declared, and in this case the following simplified fatigue equation is used:

(143)#\[N_{fi} ~=~ \frac{ \left< \sigma_u - \sigma^{max}_i \right> } { \left< \sigma^a_i-\sigma_l(\bar{\sigma}_i) \right> } ~\left[ \frac{\sigma^a_i}{M(\bar{\sigma}_i)} \right]^{-\beta}\]

Note that the above expression is equivalent to equation (1) if the M coefficient is modified according to the following equation:

(144)#\[M^{mode~simple}~=~\left( \frac{1}{a~(\beta+1)} \right)^{\frac{1}{beta}}~M^{mode~with~a}\]
  • *use mises when this option is used the maximum value \(\sigma^{max}_i\) is calculated as the maximum of the von mises invariant of tensor \(\ten {\sigma}\) (default is the maximum principal stress)

  • *mean stress this keyword allows the choice of the mean stress correction method (ie. default, variant or tos) as detailed above. Default mode is default.

*normalized_coef

this option is mandatory for anisothermal loadings. In this case a normalized stress tensor \(\ten{s}(t)~=~\frac{1}{\sigma_n(T(t))}~\ten{\sigma}(t)\) is used to compute \(N_f\) by equation (1). When a \(\sigma_n\) normalization coefficient is not explicitly defined in the material file, the stress input is normalized by \(\sigma_u\). In both cases, other coefficient should be given for the normalized stress \(\ten{s}\).

*infinity_is

this command is used to define a maximum for the \(N_f\) value stored in the results file (default is infty=1.e12).

*scale log

with this option \(log(N_f)\) is stored in the results file instead of \(N_f\) (default mode *scale lin), a choice that may be more practical to draw contour plots.

Examples#

Example 1

Example with the basic normalization mode used for anisothermal loadings. In the material file the only coefficient that depends on temperature is sigma_u, and the values given will be used to normalize the stress input. Note also that for other coefficients (sigma_l, M …), normalized values are declared in the material file, in agreement with the *normalized_coeff option selected in the input file.

**process fatigue_rainflow    ***post_processing_data
 *var sig                      **process fatigue_rainflow
 *mode with_a                    sigma_u temperature
 *mean_stress variant            800.0   20.0
 *normalized_coeff               700.0   200.0
                                 400.0   1000.0
                                 sigma_l 0.2
                                 M       20.0
                                 beta    3.0
                                 a       0.1
                                 b1      0.05
                                 b2      0.05
                              ***return

Example 2

Same as before, but with definition of an explicit normalization coefficient sigma_n, instead of the default normalization by sigma_u. Note that in this case the value given for sigma_u is normalized.

**process fatigue_rainflow    ***post_processing_data
 *var sig                      **process fatigue_rainflow
 *mode with_a                    sigma_n temperature
 *mean_stress variant            800.0   20.0
 *normalized_coeff               700.0   200.0
                                 400.0   1000.0
                                 sigma_u 1.0
                                 sigma_l 0.2
                                 M       20.0
                                 beta    3.0
                                 a       0.1
                                 b1      0.05
                                 b2      0.05
                              ***return

Example 3

Same as before but with the additional definition of M and beta as temperature-dependent coefficients. In this case calculation of an equivalent temperature by the Taira method described above will be automatically triggered.

**process fatigue_rainflow        sigma_u 1.0
 *var sig                         sigma_l 0.2
 *mode with_a                     M       temperature
 *mean_stress variant             20.0    20.0
 *normalized_coeff                15.0    200.0
                                  5.0     1000.0
***post_processing_data           beta    temperature
 **process fatigue_rainflow       3.0     20.0
   sigma_n temperature            3.0     200.0
   800.0   20.0                   5.0     1000.0
   700.0   200.0                  a       0.1
   400.0   1000.0                 b1      0.05
                                  b2      0.05
                               ***return