**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:
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:
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:
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.
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:
where stress \(\sigma\) is replaced by the corresponding normalized value noted \(s\) in equation (2).
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^*}\):
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):
\(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):
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):
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
nameis 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
orscalar
) of the stress component (default istensor
)*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
NF
i 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 theNLC_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:
Note that the above expression is equivalent to equation (1) if the M
coefficient is modified according to the following equation:
*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
ortos
) as detailed above. Default mode isdefault
.
*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