**process neu_sehitoglu#

Description#

This post-processor implements the thermo-mechanical fatigue model proposed by Neu and Sehitoglu [U10]. This model is a bit of a departure from the rest of the fatigue analysis post-processing in that it does not re-use components for LCF, oxidation and creep damages, but rather implements the specific forms defined in the referenced paper.

The damage is a linear summation of three components as per standard practice in thermo-mechanical fatigue studies.

(164)#\[D = D_{fatigue}+D_{oxidation}+D_{creep}\]

And the number of cycles to failure can be found from the cumulated damage over a number of studied cycles, \(N_c\):

(165)#\[N_f = N_c/D\]

The interesting part of the Neu and Sehitoglu is their assignment of a damage phase factor, which accounts for the tendency for creep damage in in-phase loading (such as found in rotating machinery or pressure vessels at high temperature), and oxidation cracking in out-of-phase loading (such as around notches in constrained geometries).

(166)#\[\begin{split}\begin{aligned} &{\phi_{ox}} = \frac{1}{t}\int_0^{t_c} \exp\left[-\frac{1}{2} \left(\frac{\dot{\epsilon}_{th}/\dot{\epsilon}_{mech} + 1}{\xi_{ox}} \right)^2 \right] dt \\ &{\phi_{cr}} = \frac{1}{t}\int_0^{t_c} \exp\left[-\frac{1}{2} \left(\frac{\dot{\epsilon}_{th}/\dot{\epsilon}_{mech} - 1}{\xi_{cr}} \right)^2 \right] dt \\ \end{aligned}\end{split}\]

So the coefficients xi_ox and xi_cr control the width of oxidation and creep effects about pure out-of-phase and pure in-phase loading respectively.

Fatigue part

The fatigue part can be determined in several ways. In general we look at the strain range as being the maximum shear strain range in from the cycle calculated as follows:

(167)#\[\Delta\gamma = \dfrac{1}{2}(\Delta e_1^{loading}-\Delta e_3^{loading}) + \dfrac{1}{2}(\Delta e_1^{unloading}-\Delta e_3^{unloading})\]

with the \(\Delta e_1\) and \(\Delta e_3\) terms being the 1st and 3rd ordered eigenvalue of the strain increment from across the cycle. Note that the default method does not take the critical plane of all loading points in the cycle, but rather just the points of the major temperature cycle. If the *use_loading or *use_unloading option is given, we use only one term above instead of the average. Normally for a stabilized cycle the loading and unloading parts should be symmetric.

In the above strain range calculation, we also allow for either the total mechanical strain to be used (model neu_sehitoglu) or the plastic strain range (model neu_sehitoglu_evi), and currently there is no HCF (stress based) part taken into account.

Lifetime is predicted via:

(168)#\[N_f^{fatigue} = \frac{1}{D_{fatigue}} = \frac{1}{2}\left[\frac{\Delta\gamma}{2\epsilon_c'}\right]^{1/c}\]

where we have the coefficients eps_f and c . If temperature dependent coefficients are given for the fatigue part, the values calculated at the cycle average temperature are used.

Oxidation part

The oxidation damage is calculated via the following equation:

(169)#\[D_{ox} = \frac{1}{N_f^{oxide}} = \left[\frac{\overline{h}_{f}\delta_o}{B\phi_{ox} K_p}\right]^{-1/\beta} \frac{2(\Delta\epsilon_{mech})^{2/\beta+1}}{\dot{\epsilon}^{1-a/\beta}}\]

Which uses a term for the critical oxide depth:

(170)#\[\overline{h}_{f} = \frac{\delta_0}{(\Delta\epsilon_{m})^2\,\phi_{ox}\,\dot{\epsilon}^a}\]

And an assumed parabolic oxidation rate:

(171)#\[K_p = \frac{1}{t_c}\int_0^{t_c} D_o \exp\left[\frac{-Q}{R T(t)}\right]dt\]

For the oxidation part the coefficients to be entered are D_0, Q, B, beta, delta_0, a, h_cr . Note that increasing D_0 or B increases the damage effect, bigger Q will emphasize an abrupt change in high temperature degrading (but require a change in B to compensate), while decreasing either delta_0 or h_cr will increase the oxide damage. These later parameters should be calibrated from primary metallurgical parameters from specialized oxidation tests. If the model is being used empirically then there is quite a great deal of redundancy in these parameters and the user should use caution.

Creep part

The creep damage equation is:

(172)#\[D_{cr} = \frac{1}{N_f^{creep}} = \phi_{cr}\,\int_0^{t_c} A e^{-\Delta H/RT} \left[ \frac{\alpha_1 J(\ten \sigma) + \alpha_2 \dfrac{1}{3}Tr(\ten \sigma)}{K} \right]^m dt\]

with \(J(\ten \sigma)\) being the von Mises equivalent stress. The creep damage will occur only in tensile loading under uniaxial conditions if \(\alpha_1 = 1/3\) and \(\alpha_2 = 1\) (these are the defaults).

For the creep part the coefficients to be entered are alpha1, alpha2, A, K, m, dH which should be obvious names from the above equation.

Output#

A large output set is generated by this processor, but with only one solution map for the whole history analyzed. The following summarizes the output variables:

the number of cycles detected for validation. There may be zones where the number is incorrect in totally unloaded portions of a model. the life prediction based on the history so far, and log base 10 of that lifetime for flatter contour plots. the “damage” so far in the loading history, with 0 being undamaged, and 1 full failure. D is total, Dox oxidation part, Dcr the creep part. extrapolations of the lifetime to account for the trend in evolving strain ranges. the number of cycles forward in the extrapolation. average value of the plastic strain range (or effective range used for LCF calculations). “phase factors” for the oxidation and creep effects as defined by sehitoglu. zero means that effect is not considered because of the type of loading.

Syntax#

Basic options for this post are:

**process neu_sehitoglu [ *extrapolation_cycles n1 n2 n3 ] [ *extrapolation_sequence n1 n2 n3 ] [ *max_cycles maxc ] [ *model_coef ] \(~\,\) ... [ *R R-value ] [ *skip_first skip ] [ *small_strain_rate sm-rate ] [ *use_loading ] [ *use_unloading ]

*extrapolation_cycles

gives absolute cycle numbers which will be used to extrapolate the trend in fatigue life. This is used when cycles are not yet stabilized.

*extrapolation_sequence

gives a series of cycles ending with the last detected cycle which will be used to extrapolate the trend in fatigue life. This is used when cycles are not yet stabilized.

*max_cycles

limits output cycle number as essentially infinite life. This is convenient to limit the ranges for contour plotting.

*R

sets the gas constant in case of different units. The default value is 8.3144e-3 KJ/(mol K).

skip_first

causes the first skip cycles to be left from consideration in order to limit damage prediction from large initial transient cycles.

*small_strain_rate

gives a small strain rate which will be used in several locations to limit divide by zero conditions, including the strain rate effect and prediction of the constraint average.

*use_loading

indicates that only the loading portion of the strain range will be used for fatigue. This would normally be detected as the heat-up side of a TMF cycle.

*use_unloading

indicates that only the unloading portion of the strain range will be used for fatigue.

Additional controls are allowed for the part. Currently these are:

\(~\,\) [ *width wid ] \(~\,\) [ *major_tensor tens-name ] \(~\,\)*range_tensor tens-name ]

*width

gives a size control for detecting cycles. If too few cycles are detected the number is probably too large; too many cycles detected and the size is probably too small (default \(10^{-4}\)). Units will be that of the major tensor.

*major_tensor

select the name of the variable to be used for cycle detection (default sig).

*range_tensor

select the name of the variable to be used for strain range calculations (default eto).

For the TMF cycle tool (default) the following additional commands are available (however *major_tensor and range_tensor are disallowed).

\(~\,\) [ *total_strain_for_range ] \(~\,\) [ *mechanical_strain_for_range ] \(~\,\) [ *temperature_unit celcius|fahrenheit|kevin ]

*total_strain_for_range

detect the cycles based on the total strain. Note for fully constrained test cases this will always be zero so the mechanical range should be used. Conversely for basically unconstrained conditions using the total strain will be a better choice.

*temperature_unit

use the mechanical strain for the range calculation.

Note

If the coefficients D_0, Q, B, beta are not entered the oxidation part will be skipped without mention. Likewise if alpha1, alpha2, A, K are not entered the creep damage will be skipped. Partially entering these coefficients will cause an error message.

Example#

The following example is from Post_test/INP/sehitoglu1.inp

***local_post_processing
  **file integ
  **elset ALL_ELEMENT
  **output_number 1-99999999

  **process neu_sehitoglu_evi
   *total_strain_for_range
   *model_coef
     eps_f  0.20
      c    -0.64
      b        1.0
      sig0_E  0.0
      xi_ox        1.0
      xi_cr        0.20
      a  0.0
      D_0       2000.
      Q        200.
      B    7.00e-03
      beta        1.5
      delta_0    2.00e-07
      h_cr        500.
      alpha1        0.33
      alpha2        1.0
      A    1.00e+08
      K  temperature
       1.00e+06  0.
       1.00e+06  450.
       20.0      600.
       20.0      1200.
      m     2.0
      dH    200.