The approach to fatigue proposed in this procedure is STRESS-LIFE or HCF (High Cycle Fatigue). In order to evaluate fatigue life, it is necessary to know the S-N curves for each material under examination. Since the company has never carried out any specific fatigue tests, the curves referred to were always taken from bibliographic sources of various kinds. The procedure set-up remains valid regardless of the origin of the curves, but obviously the accuracy of the results relies on the validity of the curves chosen. In general, the fatigue curve refers to the specimen tested with an alternating symmetrical load, for example the test performed on the Moore machine; therefore, the curves that must be included in the calculation should consider all the non-ideals that actual pieces offer: much larger dimensions than those of the specimen, radii of curvature and surface finish, higher temperature than the ambient temperature, etc. All this means that the curve must be scaled by a factor, the so-called Kf or strength factor, which according to our experience reaches about 0.4, as shown in Figure 7 (thick green line).
Fig. 7 - Corrections for different Kf of SN curves for alloy A356.
Fatigue analysis
TThe entire exercise was carried out in the Workbench environment. A suitable set of MAPDL macros which can be launched directly from the Workbench interface using ACT customization, was created for the fatigue procedure. The aim of the activity therefore was the realization of an ANSYS MAPDL procedure for the verification of the fatigue life even of complex assemblies under repetitive load conditions. The procedure assumes a known test load cycle, thought to be repeated endless times, linked to the bench testing phase of the machine. As a starting point, the procedure requires the resolution of the harmonic analyses considering all the important frequency components necessary to reconstruct the input load cycle, and of the static representing the average conditions. Using the results generated by these simulations, one proceeds to the temporal reconstruction of the voltage history in the points of interest for the temporal duration of the cycle - in particular, one needs to obtain the temporal history of the signed Von Mises. This temporal history is then broken down into a history of peaks and valleys, useful for counting the load cycles using the rainflow procedure. Taking note, therefore, of the load cycles in terms of the mean and alternating voltage and their number present in the temporal history of the signed Von Mises, one then proceeds to correct the alternating voltage taking into account the mean value, according to Soderberg’s theory (one can also insert further criteria to correct the mean value). With these values one enters the S-N curves to calculate each contribution’s number of breaking cycles and therefore the total damage and the fatigue life. A comprehensive explanation of the functionality of each macro is given below.
Macro “0_parameters.inp”.
Requires all the parameters useful for the subsequent fatigue analysis to be defined manually by the user. The S-N curves of each material of the components on which you want to perform the fatigue post and the yield stress (useful for correcting the average value of Soderberg) must obviously be included among the various data to be provided.
Macro “1_body_macro.inp”
This is the mother macro that calls all the other macros, including the 0_parameters.inp macro, in the right logical order. This is the macro launched by the ACT customization once the parameters have been set in the 0_parameters.inp macro.
Macro “2_post_statica.inp”.
This represents the first action to be performed in logical order. It corresponds to the post-processing on the nodes of interest of the static analysis that represents the constant as the time of the system’s response to the loads applied as input varies. In particular, an array called “post_static_nodeXXX” (XXX is the number of the corresponding node in each case) is generated for each node of interest, and consists of a single row with 12 columns that report all the voltage tensor components, the main voltages, and the equivalent von Mises and signed Von Mises voltages. For example, for the node 92899 (a generic node of the conveyor skin) one obtains the following “post_static_node92899” array
Macro “3_post_harm.inp”.
This corresponds to the post-processing on the nodes of interest of the harmonic analyses generated. These represent the variable of the system’s response to the loads applied as input. In particular, this macro reads the file of the harmonic results for the various frequencies analyzed, first loading the real part and then the imaginary part for each of them. An array called “post_harm_nodeXXX”, which consists of as many rows as the harmonics analyzed and 16 columns with the real and imaginary parts of all the voltage tensor components, and the equivalent von Mises voltage, is generated for each node of interest. For example, for the node 92899 you get the following “post_harm_node92899” array
Macro “4_reconstruction_temp.inp”.
This corresponds to the reconstruction of the temporal response of the signed von Mises voltage for the temporal duration of the load cycle on the nodes of interest. This reconstruction is based on the results of the prestress static analysis and of the harmonic analysis generated and post-processed in the previous steps. In particular, the macro reconstructs all the tensors of the voltages x, y, z, xy, xz, yz for each node and for each temporal step at each instant, and recombines linearly the constant contribution of the statics and the variable contributions in time of the different harmonics, each with its own module, phase and frequency (or equivalently, the real part, the imaginary part and the frequency). Once the voltage tensor has been reconstructed on each node and for each instant, the equivalent von Mises voltage and the main voltages at that given instant can be calculated.

In particular, the Von Mises voltage is calculated with to the following formula where the tensor components are known: 
While the main voltages are calculated by solving the following thirddegree polynomial for each instant:

Depending on which is the main voltage with higher module, the sign is assigned to the Von Mises previously calculated, thus obtaining the signed Von Mises (positive if mod(σ1) ≥ mod(σ3), negative if mod(σ13) > mod(σ1)); An array called “ricostr_temp_nodeXXX” (XXX is the number of the corresponding node in each case) is then generated for each node of interest, which consists of one row for each time step analyzed and 11 columns that report the time reconstruction of the 6 components of the voltage tensor, the reconstruction of the main voltages s1 and s3 and of the signed Von Mises; for example, for the node 92899 you get the following “ricostr_temp_node92899” array
By plotting column 11 of the signed Von Mises Voltage as a function of the times of column 2, one obtains the equivalent uniaxial response of the system for that specific node (for example, node 92899) as the time varies, which is useful to evaluate the fatigue life. During this phase, the procedure also evaluates the absolute maximum and minimum values recorded by the time history of the generic node’s signed von Mises and saves them in the variables max_assol_ nodeXXX and min_assol_nodeXXX.
Fig. 7 - Corrections for different Kf of SN curves for alloy A356.
Macro “5_creation_spiovents.inp”.
This macro simplifies the temporal history of the signed Von Mises for each node, transforming them into a history of “levels”, in other words, moving from an analog signal to a digital one. The number of layers used is a parameter “N_bin_x_rainfl” that can be modified within the macro 0_parameters.inp (the higher this number, the more accurate the reconstruction, but the slower the subsequent creation of the rainflow will be). The absolute minimum-maximum interval of the signed Von Mises voltage of the node being examined is divided into N_bin_x_rainfl levels, each with an amplitude equal to abs(max_assol_ nodeXXX-min_assol_nodeXXX) / (N_bin_x_rainfl-1). The central value of the level’s voltage is assigned at each level. Level 1 corresponds to the absolute minimum of the signed Von Mises for that node, level N_ bin_x_rainfl (for example equal to 50) corresponds to the absolute maximum of the signed Von Mises.
We record the level to which each voltage value of the temporal history of the node being examined corresponds in the first column of the array st_temp_liv_nodeXXX (an array with one row for each temporal step and 2 columns), which therefore represents the rewriting of the temporal history of the signed Von Mises in terms of a history of levels. To create the rainflow, the temporal history must start from the absolute minimum or maximum. Therefore, the same temporal history is reported in the second column of the st_temp_liv_nodeXXX array, starting with the first instant in which the absolute minimum is recorded (this is possible based on an assumption of a history of infinitely repeated loading). After creating the temporal history of the levels, one proceeds with the creation of the “slopes” on which the “rainflow”’s rain lines can flow; to do this, one must record all the broken lines (in increasing order) that join a peak with the next valley, and vice versa. Therefore, a “spioventi_nodeXXX” array is generated for each node which shows the split times (with 10 columns and a row for each time step, even if the number of split times will generally be lower than the number of time steps; the number of split times will be saved in the conta_ spezz_nodeXXX variable); the first column shows the starting level of the split times and the second column shows the finishing level. The third column is initially created the same as the second, but is then modified by the rainflow’s next macro (the successive columns are always filled later by the rainflow’s macro). The rows after the conta_spezz_nodeXXX number will be empty.
Fig. 9 - The spioventi_nodeXXX variable to record the process of counting the rainflow
Fig. 10 - The basic rules of the rainflow algorithm.
Macro “6_rainflow.inp”.
This macro counts the cycles present in the signed Von Mises temporal history for each single point of interest using the rainflow methodology. In particular, note the cyclical time history of the signed Von Mises for each point considered, counting takes place according to the rules of Figure 10. The 6_rainflow.inp macro does the counting for each point of interest according to this theory and saves the information about the start and end of the cycle counted in the spioventi_nodeXXX array; more precisely, the value of the cycle start level is stored in column 1 and value of the cycle end level (the level at which the “water flow” of the rainflow is interrupted) is stored in column 3. Knowing the starting and ending levels of each semi-cycle, we can go back to the voltage values corresponding to these levels, which represent the minimum and maximum voltage values of the semicycle, which are then saved in in column 4 and 5 of the spioventi_ nodeXXX array. Columns 6 and 7 show the average and alternating voltage values of this semi-cycle, calculated as shown in Figure 11.
Macro “7_png.inp”.
This macro serves the main macros previously described and is used to generate an external .png image of what was actually plotted.
Macro “8_fatica.inp”.
This macro carries out the real fatigue analysis for each node of interest, taking into account the material properties of the component to which it belongs (yield stress value, to correct the mean value, and the S-N curve for the fatigue life). Firstly, it evaluates the correct alternating voltage of the mean value for each half-cycle present in the signed Von Mises temporal history for each node of interest. In fact, column 8 of the spioventi_nodeXXX array shows the value of the equivalent alternating voltage, obtained after correcting the alternating voltage with respect to the average recorded voltage. The correction was made according to Soderberg’s theory (as requested by the customer):
According to this theory, the correction is applied only if the average voltage is tensile, while no correction is applied in compression. If the average voltage is in modulus greater than the yield strength, however, whether in tension or compression, an infinite alternating voltage is assumed (the macro imposes this equal to 1012 Pa).
Fig. 11 - The Sodeberg criterion in the Cartesian plane for medium effort-alternating effort.
Fig. 12 - Principles of linear damage accumulation.
Using this equivalent value of alternating voltage, we can enter the corresponding S-N curve (defined for each component of interest in the 0_parameters.inp macro) and calculate the corresponding number of breaking cycles. At the intermediate points of the curve, the value of N for the desired equivalent alternating voltage is interpolated linearly. For voltage values beyond the extremes defined in the curve, N maintains constant the last defined value. This value of N is shown in column 9 of the spioventi_nodeXXX array. In column 10 of this array, we report the damage relative to the semi-cycle considered, which is evaluated as: Damage=0.5/N_cicli_a_rottura; at this point, we are able to evaluate the total breakage damage caused by the signed Von Mises time history for each node, broken down into semi-cycles. To do this we use the Palmgreen-Miner linear damage accumulation rule
Fig. 13 - An example of the out_fatica_pelle_kkkk file.
Therefore, adding together all the damage of each semi-cycle for each node studied (reported in column 10 of the spioventi_nodeXXX array), the fatigue damage relative to the load cycle analyzed and thought to be endlessly repeated is obtained. This Damage value for each node is saved in an array called out_fatica_pelle_kkk (where kkk is the index that runs the various defined named_selection on which the fatigue analysis is to be performed). This array has one row for each node making up the named_selection number kkk and 4 columns. Column 1 shows the number of the node in question, column 2 shows the total damage relative to the entire input time history calculated as described above. Column 3 reports the number of blocks of this load history to reach breakage, calculated as: N_blocchi_arottura=1/ Danno_tot; column 4 shows the final fatigue life in hours, calculated as: Vita_ore=N_blocchi_arottura*t_fin*1/3600 dove t_fin is the time duration of the input load cycle. The macro also automatically saves multiple png images that represent the damage map, the number of breaking load blocks and the fatigue life in hours. The out_fatica_pelle_kkk arrays are automatically saved in the workbook in appropriate text files called out_fatica_pelle_kkk.dat (one file for each named_selection), as are the damage and fatigue life maps plotted on the model.