MLife Fatigue DEL Calculation

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

Dear All,

im using Mlife to calculate fatigue loads.
I would like to specify the distribution of the runs by myself so I need to create a file for the variable “DistribFile” in Mlife.

Can someone give an example how this file should look like?

Best regards,
Simon

UPDATE:
In the source dir that comes with the latest Mlife_archie there is a function write_joint_pdf.m with this function it is very easy to create needed binary distribution files.

Dear Simon,

Presumably you mean MLife input parameter “DistribName” rather than “DistribFile”.

Test28.mlif in the MLife CerTest provides an example with a user-defined distribution, with the user-supplied distribution table given in CertTest/Data/WindDistrib.dat. But this file is in binary format, and so, is not human readable. However, the format is described in the document, “User_Probability_Distributions.pdf” given in the Documentation directory.

I hope that helps.

Best regards,

Dear Jason,

thank you for clarifying!

In order to validate mlife against Bladed postprocessing I try to do a fatigue calculation with only one time series and one sensor. But Mlife is giving me following error:

I also included the mlife settings file.
Is there any error or misunderstanding?

Best regards,

Simon

UPDATE:
I compared the basis of my settings file (Test28.mlif) with others (e.g. Test01.mlif) and found some differences. Apart from some names that are defined different I can find the option for a user specified distribution in Test01.mlif.
Then I tried to run Test28.mlif with Mlife_win32.exe and got the same error as shown below.
Test01.mlif works.
Can you provide a working example of Mlife with user defined distribution?

UPDATE_2:
It seems, that the compiled Mlife in Version MLife_v1.01.00a_0 is not updated. Can you provide a compiled version of the latest version? I don’t have a needed Toolbox for Wind Speed binning (function wblcdf) in Matlab so I need to run Mlife as a compiled version.
Mlife_HC_fix_Mx.txt (6.85 KB)
Error.JPG

Hello Simon,

Unfortunately, we do not have the resources to supported pre-compiled versions of MLife at this time. The good news is that you can still use MLife! You simply need to create your own version of the Weibull cumulative distribution function, wblcdf() function.

[url]https://www.mathworks.com/help/stats/wblcdf.html[/url]

I cannot vouch for the following, but here is an example:

[url]http://www.dynare.org/dynare-matlab-m2html/matlab/missing/stats/wblcdf.html[/url]

Best Regards,

Greg