MLife Fatigue DEL Calculation

Hi all,

I am using MLife to do fatigue analysis. When it comes to the calculation of fatigue damage equivalent loads (DEL), I find some of the parameters I do not understand.

According to MLife user manual, each fatigue channel requires several input parameters

(1)“NSlopes” and “SNslopeLst” (Wohler exponent(s)): Wohler exponent (SN curve property) relates with material, such as around 10 for fiberglass (when calculating DEL of blade root bending) and 3 for steel (when calculating DEL of nacelle yaw, tower bending or mooring line etc., I guess).
(2)“BinFlag BinWidth/Number” (load range binning values): It seems the binning value decides the resolution of rainflow cycle counting.
(3)“TypeLMF” (the fixed-mean load): This parameter can be specified as a determined value, or AM for using the channel’s aggregate mean across all input files, or WM for weighting the channel’s means on a per file basis using the specified Weibull distribution.
However, I do not know which option should I choose and how to specify the value if I choose the first option, although I get some useful information from Subin’s post [url]MCrunch issue with Rainflow Cycle Exceedance plot - #6 by Greg.Hayman].
(4)“LUlt” (the ultimate load): I do not to know how to specify this value either. Is it a property for certain material?

Thanks in advance.

Best regards
Yulin

Yulin,

Your questions about the specification of both L_MF and L_Ult is a common one. Unfortunately, there is no general answer that I can give you. In my opinion, the answer depends on the nature of your analysis/study, and the available information you have about your turbine design.

For generalized design studies, some people choose to perform their fatigue-life analysis without applying the Goodman correction. In MLife this is possible by setting the GoodmanFlag to zero. In this case, setting GoodmanFlag to 0 tells MLife to use the load range cycles without applying a correction, and to use a zero fixed-mean load. This correction is based on a value of L_Ult. Please refer to the MLife Theory manual for additional information regarding the application of the Goodman correction within MLife.

If you do wish to incorporate the Goodman correction, you could always use MExtremes to determine the extreme loads for a given channel and then pick an ultimate load L_Ult which makes sense given the extreme loads your design will encounter. Likewise, if you don’t have a good idea of which L_MF to choose, you may wish to simply let MLife compute the fixed mean value by setting the TypeLMF setting to AM.

Best Regards,

Greg Hayman

Hi everybody
I’m using Mlife for fatigue analysis of a NREL 5MW TLP turbine; I used the same procedure of 66 wind files created by TurbSim with different Seeds;
(is there any suggestions for seeds and the range of them?)
But here is the question:
When I get the TurbSim results I need to put them in FAST; So for each of winds I need a Hs and Ts for wave height and period; for finding these parameters I use SPM-JONSWAP which has a formula for finding Hs and Ts in these formula we need a Fetch Length which I don’t know what I have to use! I decided to use 100km for that? is it right?

Best
Hamid

Dear Hamid,

The seeds in TurbSim or HydroDyn should be chosen randomly.

I’m not familiar with the SPM formula. Typically, we derive correlated values of wind speed, significant wave height, and peak-spectral wave period from a site-specific joint probability distribution.

Best regards,

Dear All,

I have some problems using MLife and I hope that you can help me out.
When I run Mlife using the source code, I have the “Rainflow: To many arguments” error message (the message is specified in rainflow.c and “too” is misspelled there as well). When I look at rainflow.m I find that the rainflow function requires just 2 inputs or less but in Mlife source code (compute_fatigue_per_DEL_type.m) specifies 4 inputs:

% Rainflow count the cycles using a mex function. % For comparison, you could also using the Matlab function generate_cycles() cycles = rainflow(double(peaks), abs( double(lmf)), double(Fatigue.ChanInfo(iCh).LUlt), double(Fatigue.UCMult))'; % cycles = generate_cycles( peaks, Fatigue.UCMult, double(Fatigue.ChanInfo(iCh).LUlt), double(lmf) );

Can you explain to me how you are using the rainflow function and why do I get this error?
Now, when I want to run Mlife using the compiled version Its says that it can’t find the mex file cf. attached picture (even though I added it manually and I added the path to include MCR win64 folder “C:\Program Files\MATLAB\MATLAB Compiler Runtime\v716\bin\win64”, I have a 64-bit windows 7) . Do you know why I have this error?

For discrete events, the user’s guide says that “the damage cycles from these files are weighted by the number of occurrences of the event”. This is specified using DLC_Occurrences. In the example I have in CertTest, This variable is not mentioned and I don’t know how to specify it. Would Mlife read this line"10 DLC_Occurrences" If I write is just before my discrete event and allocate is to FileInfo.DLC_Occurrences ?
can you explain what this part of the code means? (in read_settings.m)

FileInfo.DLC_Occurrences = [];

Regards,

Mohamed Yassin OUKILA
erreu.jpg

About the compiled version of Mlife, I didn’t have the visual studio 2010 SP1 run-time libraries. Installing it (after having the admin privileges) solved the problem.

Hi everyone,

I’m using FAST to simulate the influence of a blade mass imbalance on the turbine’s fatigue lifetime. When post-processing the generated data with MLife I came across a few questions which I hope you can help me out with:

  1. Similar to previous posts, I’m also struggling with what value to choose for the ultimate load LUlt. On the FAQ homepage, it is recommended to use the maximum value of all time series and multiply it by several scaling factors (1.25, 2.5, 5, 10, and 20). When I do this, I can indeed observe that the DELs of my forces / bending moments are asymptotically approaching a fixed threshold for large values of LUlt. As I would prefer to analyze only as few as possible values for LUlt, I was wondering why not to pick a scaling factor of 20 immediately (LUlt = 20*max{time series})? If I interpret the text right, the bigger I choose my LUlt-value, the more exact my DEL solution should be. Is this assumption correct? And if not: how do I know I made a reasonable choice for my scaling factors / LUlt?

  2. When determining the extreme value of the time series to calculate LUlt, I’m confronted with another problem. Some of my variables (e.g. LSSGagFzs) are negative across all time series, so my maximum value is negative as well. However, MLife does not accept negative LUlt-values as input arguments. Am I on the right track when I determine LUlt in this case with the absolute value of the lowest observable data point: LUlt = X*abs[min{time series}]?

  3. My last question is not directly related to the ones before – nevertheless I hope for advice. I am wondering how the DEL values of spatially adjacent variables interact. For example, if I obtain a certain increase in my DEL values (e.g. DEL_RootFys_new = 1.1* DEL_RootFys_ref and DEL_RootFzs_new = 1.15* DEL_RootFzs_ref) what does that mean for the fatigue of the overall blade structure? Is there a way to predict a correlation between the DELs in different coordinate directions?

Thanks in advance – I would greatly appreciate your help!
Julia

Dear Julia,

Here are my answers to your questions:

  1. Using a range of scaling factors simply provides a way of verifying that you are approaching the asymptotic limit, if indeed that is what you are after. The asymptotic limit is not the “more exact” answer; the best thing to do is to base LUlt on a strength (e.g., FEA) analysis of the cross section of the component in question. If you are convinced that a scaling factor of 20 is sufficient for your needs, than use it.

  2. Yes, if you are basing LUlt on the time series, you should base it on the absolute maximum, so, the equation would be something like: LUlt = X*MAX( MAX( time series ), ABS( MIN( time series ) ) ).

  3. I’m not sure I understand your question or know how to answer it.

Best regards,

Dear Jason,

Thanks a lot for your quick reply!

  1. I think I gained a better understanding for the choice of L_Ult thanks to your answer. Is it possible to paraphrase your statement like this? “Without running a FEM analysis it is not possible to predict the highest load the structure can bear precisely - as a result one has to make some kind of assumption. One possible approach to approximate L_Ult is to scale the extreme values of the time series with a certain factor X. There is no “best practice” how big X should be (depends on how conservative one wants to be).”
    I found two research papers (one suggests X=1.5 and the other X=[1.5 … 4.5]), so I will most likely choose something in a similar range.

  2. I admit that this question is a bit complex, but I will try to rephrase it: I am calculation the lifetime DELs for a modified parameter setting and compare it to a reference state. Out of the DEL increase I determine the new lifetime of the components t_new for the modified case (t_ new = 20a*(DEL_mod/DEL_ref)^m), assuming the structure has experienced the same damage after t_ new as the reference structure has after 20years.
    As a result I get different lifetime reductions Δt = 20a - t_ new for all variables. I am now wondering what this means for the lifetime of e.g. the
    a) overall blade structure when I obtain different Δt values for RootMxb and RootMzb
    b) overall rotor bearing structure when I obtain different Δt values for LSSGagFys and LSSGagFzs
    (certainly one cannot simply add the single lifetime reductions)?
    I am sorry to bother you with this question – I just thought you have lots of experience and knowledge on how to interpret simulation results.

Kind regards - and once more thanks,
Julia

Dear Julia,

  1. Yes, I agree with your paraphrasing.

  2. I’m not following everything in your question, but I believe the answer is that you should not be comparing the lifetime reduction of RootMxb against RootMyb (or the like). Instead, fatigue should be analyzed in terms of load roses–that is, one would calculate the lifetime reduction at a number of different orientations around the beam and the orientation with the least reduction is what would be expected. Load roses are discussed further in the following forum topic: A question on measuring the shaft bending moment in FAST.

Best regards,

Dear Jason,

Thanks a lot for your hint with the load roses. It seems quite reasonable to take the influence of the different load orientations this way into account.
Nevertheless, I’m afraid, I have to add another 2 questions concerning this topic:

  1. In your post you write that I need to consider “the orientation with the least [lifetime] reduction”. Could you please explain more in detail why you would choose the least reduction (I would have intuitively assumed that the sector with the biggest reduction is the relevant one)?

  2. Making use of the load roses feature of MLife simplifies the fatigue life prediction because it reduces the number of variables I need to consider. For example I can focus on the DELs of LSSGagFyzs (= extreme values of the sector variables [LSSGagFyzs_1, LSSGagFyzs_2, …]) instead of having to analyze the DELs of LSSGagFys and LSSGagFzs separately.
    What I’m wondering now is, whether there is a way to include the effect of LSSGagFxs as well? In other words: is it possible to obtain a DEL value which represents the load level of all 3 coordinate axes integrally?

Thanks a lot – I appreciate your continuous support,
Julia

Dear Julia,

  1. You’re right. I meant to say that the orientation with the minimum lifetime (maximum reduction) is the one you should use.

  2. Good question. The load-rose approach is common industry practice, but you are right that it doesn’t account for a complicated multi-component stress state (axial, shear, bending, etc.) especially for a nonaxisymmetric cross sections composed of an anisotropic material; I’m not exactly sure how fatigue is processed for those structures.

Best regards,

Dear Jason,

Once more thanks for your answer!
Your posts have contributed a lot to help me understand how to postprocess the data generated by FAST.

Kind regards,
Julia

Hi Julia, could you please share these research papers? I am also interested in this scaling factor. Thanks.

Hi

I am using MLife for a fatigue analysis of the NREL 5MW OWT to study the effect of different foundation models on the fatigue damage of the tower.
I am not sure if I have understood MLife correctly, and I have a few questions.

I have run 16 different load cases in FAST, with different wind and wave parameters. Since I am considering foundations, and that the largest loads occur at the mudline, I use the fore-aft bending moment at mudline for the 16 time series (channel 53) as input to MLife to find fatigue damage at the mudline, time until failure and DEL. Please see my attached MLife input file. My questions are:

  1. Is this a reasonable approach for calculating fatigue damage?

  2. MLife uses a Weibull distribution to model the wind. Does this mean that the moment values from the time series are weighted according to their wind speed? I.e. that the loads from time series with very strong wind (U>WSout) contribute very little to the lifetime fatigue damage, while the load from load cases with high probability of occurence contribute the most?

  3. How does MLife calculate the short term DEL? Is the wind modelled by a Weibull distribution for each time series, or is the wind speed not considered? When I look at the results for the short term DELs, the highest DELs are from the load cases with the strongest winds and highest waves, which makes sense. Do I just multiply these DELs with probaility of occurence of the load case to find out how much these load cases contribute to the total damage? Is this the approach MLife uses to find the lifetime DEL?

Thank you!

Best regards,
Ingrid Bye Løken
Fatigue_MLife.txt (6.88 KB)

Dear Ingrid,

Here are my answers to your questions:

  1. Overall your approach sounds reasonable. Of course, normally you’d run many more than 16 simulations (e.g. by running multiple seeds and conditions) and process more than just the mudline fore-aft bending moment. And for offshore loads analysis, it is often important to consider a multi-dimensional probability distribution of wind and waves. From your description, it sounds like you are only considering a one-dimensional Weibull distribution of wind (and presumably, the wave conditions are conditioned on wind speed).

  2. Yes, the lifetime fatigue calculation is weighted by the probability distribution. Of course–depending on the material exponent (m)–large amplitude cycles with low probability of occurrence may be just or more important than low amplitude cycles of high probability.

  3. Short-term DELs are computed independent from the probability distribution, considering only the rainflow cycle counts from an individual time series.

The equations MLife uses for the various calculations are documented in the MLife Theory Manual: nwtc.nrel.gov/system/files/MLife_Theory.pdf.

Best regards,

Dear Mr. Jonkman

Thank you so much for your quick and heplful reply.

I know I would have to run many more load cases to get an exact result for fatigue life, but as I am comparing foundation models, and running a great number of analyses would be very time consuming, I decided to only model 16 load cases (wind speed 2 m/s to 32 m/s, based on a scatter diagram on wind and wave data from a certain site), with only one-dimensional Weibull distribution. Do you think my simple approach is sufficient enough to get useful results for my purpose?

I have two other questions:

  1. As I have understood reading this forum and some other publication, there is no recommended value to use for LUlt, even though it highly affects the MLife results. So after doing some research I chose to use a value for LUlt that would make the time until failure of one of my models approximately equal to the design lifetime, so that I could compare my other foundation models with respect to a “reasonable” lifetime of around 20-30 years. Do you have any other recommendations on what value to choose for LUlt?

  2. As the value of m also has great influence on the results, I am wondering what value you would choose for the structure at the mudline? (I chose m=5, as this is recommended by DNV for structural details in the high cycle fatigue range in seawater with cathodic prodection)

Best regards,
Ingrid

Dear Ingrid,

With only one seed per wind-speed bin, I would be a bit concerned that the calculated fatigue loads would depend on the seed. I would suggest running more seeds to assess the sensitivity–ideally the fatigue solution would be seed independent.

There is some discussion on how to choose LUlt in our FAQ: nwtc.nrel.gov/FAQ#TypeLMF. For a simple cylindrical steel cross section, you should be able to calculate LUlt analytically see e.g. my post dated Feb 23, 2016 in the following forum topic: MLife/Interpretation of DEL and LUlt - #2 by Jason.Jonkman.

For steel, often the fatigue analysis is performed over a range of material exponents e.g. m = 3, m = 4, and m = 5.

Best regards,

Dear Jason,

I am analysing blade root fatigue using MLife v1.01.00a-gjh for Test02.mlif. I have the following two queries:

  1. mlif.m runs as expected for the test case, but I get an error if I want to produce a load rose for the test case using:

----- Load Roses ------------------------------------------------------------- 1 nLoadRoses The number of load roses to generate. Rose Name Units Channel1 Channel2 nSectors “RootFxyc1” “kN” $RootFxc1$ $RootFyc1$ 12
The error reads:

[code] Warning: repmat(A,M) or repmat(A,M,N) where M or N is an empty array will return an error in a future
release. Replace empty array inputs with 1 instead.

In read_one_file (line 93)
In mlife (line 348)
Rows=159733, Cols=135
Error using .*
Matrix dimensions must agree.

Error in read_one_file (line 119)
timeSeriesData(:,1:NumIC) = repmat(scales,nLines,1).*timeSeriesData(:,1:NumIC) +
repmat(offsets,nLines,1);

Error in mlife (line 348)
[ FileInfo.Time, nLines, FileInfo.Title{iFile} ] = read_one_file( …
[/code]
2. Is it possible to visualise the rainflow cycle distribution using histogram/matrices similar to WAFO?

Thank you so much for your help.

Best regards,

Faryal Khalid

For item (1), you need to modify Test02.mlif to use the StrNames functionality. It should now run without any errors.

true StrNames Use channel names following a “$” instead of numbers when specifying channels in this input file.

  1. You can access the binned rainflow counts via the data structures outlines in Appendix C of the MLife User’s Guide