**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 multi-axial 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 multi-axial stress path is computed by
**process multirange,the mean stress \(\bar{\sigma}_i\) is defined as the mean trace of tensor \(\overline{\sigma}\)
\[\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_misesoption) 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:\[\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:\[\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:\[\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 hypersphere 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 ]
*varnameis 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 ASCIIcommand)*typethis optional command allows to specify the type (
tensororscalar) of the stress component (default istensor)*reverseas 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)*modecoefficient
ain the fatigue equation (1) is mainly used for non-linear cumulation with theNLC_ONERAoption (cf.*process oneraat page ), but may be skipped to compute the number of cycles to failure. This strategy is activated when*mode simpleis 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 miseswhen 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 stressthis keyword allows the choice of the mean stress correction method (ie.default,variantortos) as detailed above. Default mode isdefault.
*normalized_coefthis 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_isthis command is used to define a maximum for the \(N_f\) value stored in the results file (default is infty=1.e12).
*scale logwith 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