Eigenanalysis FAST


I have a question regarding linearization in FAST and the eigenanalysis.m file. In order to get the system natural frequencies, including platform DOFs, I set CalcStdy to False and run a linearization in FAST. PtfmLdMod is set to FltngPtfmLd, but wave radiation calculations are turned off. When I run eigenanalysis.m in Matlab I achieve a column vector with 40 natural frequencies as imaginary numbers. How do I interpret these outputs? From the linearization output file it seems like the platform DOFs are the first 6 rows, but the total number of outputs is 57, so I am not really sure which frequency belongs to which DOF. It would be great if anyone can explain to me how to interpret the system natural frequencies. Thank you.

Best regards,
Aina Crozier

Dear Aina,

The old Eigenanalysis.m script simply takes the azimuth average of the periodic linear model to obtain a constant-coefficient linear model. It is known that this process causes many problems if the linear model contained periodicity (i.e., if the model was linearized with a spinning rotor). It is far better to perform a multi-blade coordinate (MBC) transformation before azimuth averaging. Several years ago, we developed the MBC3 code that can be used to post-process the output of a FAST linearization analysis. You can find that code here: wind.nrel.gov/designcodes/postprocessors/mbc/. Since then, we’ve suggested that everyone use the MBC3 code in place of the Eigenanalysis.m script in all circumstances (in fact, we eliminated Eigenanalysis.m from the FAST archive in the last two releases of FAST). My remaining comments assume you’ve switched to using the MBC3 code.

You must compare the eigenvalues with the eigenvectors to see which frequency corresponds to which mode. The eigenvalues contain complex conjugate pairs that contain information about the natural freqeuncies and damping of each mode. The largest components of the eigenvectors represent the dominant components of each mode. I’ve created an MS Excel workbook titled “CampbellDiagram.xls” to aid in analyzing the eigenvalues and eigenvectors. (This workbook is attached.)

CampbellDiagram.xls (242 KB)

The process is as follows:
*Once a .lin file has been generated by FAST, run the GetMats.m and mbc3.m MATLAB script.
*Open up CampbellDiagram.xls and enter the information into the gray cells. Most of the information to be put into the gray cells is computed by the mbc3.m script and, so, can be copied from MATLAB and pasted in.

The CampbellDiagram.xls workbook sorts the eigenvalues and eigenvectors by frequency and highlights the dominant components of each mode. The spreadsheet is fairly self-explanatory; I hope you find it useful.

Please note the spreadsheet is meant to be used to process separate results from a range of rotor speeds in order to make the complete Campbell diagram. Typically, the first solution is always made at 0 RPM. Also, please note that the MBC3 script changes the mode descriptions as follows (when we get the chance, we plan to modify the mbc3.m script to output the MBC state descriptions accordingly):

FAST Output → MBC Output
Blade 1 DOF → Collective DOF
Blade 2 DOF → Cosine DOF
Blade 3 DOF → Sine DOF

I hope that helps,

Best regards,

Dear Jason,

thank you again for you quick reply and helpful information. I found the excel spreadsheet very useful, and I have now managed to find the platform natural frequencies. I am struggling a bit more with the wind turbine natural frequencies, and I am not sure if i fully understand the meaning of the highlighs in the spreadsheet. For the platform DOFs the mode shape magnitudes were both highlighted and with green background at the natural frequency, which therefore was easy to determine. Could you perhaps explain to me how to find the DOF that belongs to a certain natural frequency when there are many mode shape magnitudes with green background in the natural frequency colum? Thank you for your help.

A final question to be sure that I’m using the right approach: Is it correct that CalcStdy should be False when running these linearizations for different RotSpeed?

Best regards,

Dear Aina,

The eigenvectors resulting from a FAST linearization analysis represent the mode shapes for the full system (including coupling between the blades, drivetrain, nacelle, tower, and platform). Most mode shapes have coupling between these system components. The relative magnitude of each DOF in an eigenvector determines the amount of coupling that DOF contributes to a mode. For example, the first tower fore-aft mode typically includes coupling with the 1st flap modes of each blade. The phasing of each DOF in an eigenvector determines the phase of the coupling (two DOFs with the same angle are in phase and angles that are 180 degrees apart are out of phase). It is difficult to explain the mode shape interpretation more without seeing the eigenvectors.

When CalcStdy is set to False, it is likely that the solution will not be in static equilibrium before linearizing (unless the initial conditions from which the model is linearized about correctly define the static equilibrium condition). An operating point that is not in equilibrium will introduce an “effective stiffness”, which may make interpretation of the linearized model difficult, as explained in this forum topic: http://forums.nrel.gov/t/fast-model-linearization/243/1. In general, it is better to linearize a model with CalcStdy set to True. With CalcStdy set to True, FAST will search for an equilibrium condition before linearizing.

I hope that helps.

Best regards,

Hi dear community,

after reading all the posts related to Natural frequencies and Campbell Diagram I’m not sure of using it correctly, for the moment what I’ve done is:

  1. paste the MBC3 data in it’s grey cells and then going to the row “Natural (Undamped) Frequencies (Hz)”
    2.copying it in the corresponding rotational speed in campbell diagram sheet. As I understand each mode is one of the natural frequencies of the DOFs so:

Natural frequency mode 1 → 1st Tower FA
Natural frequency mode 2 → 1st Tower SS
Natural frecuency mode 8 → 2nd blade flap (collective)

If what I say is wrong, are the natural frequencies the green backgrounded red highlighted values? In addition, can someone explain me the column “states”?

Thanks in advance,

Dear Oriol,

“States” are the degrees of freedom (and their first time-derivatives) that are integrated by FAST. In FAST v7, only structural states (DOFs) can be part of the FAST linearization.

FAST linearization followed by eigenanalysis produces the coupled modes (eigenvectors), natural frequencies, and damping ratios (eigenvalues) of the full system. E.g., tower-bending typically couples with blade bending and this coupling can be seen by the eigensolution. The CampbellDiagram spreadhseet is just a tool that aids one in interpreting the eigensolution–it sorts the eigenvectors and eigenvalues by modes in the order of increasing natural frequency and shows the magnitude and phase contribution of each state/DOF, the damped frequency, and damping ratio of each mode. The dominate components of each mode are highlighted by the green background and red bold font. The eigenvectors are normalized, so, it is not the absolute magnitude of the components that matter, but the relative contribution and phase of each state/DOF within a mode that matters. Please review the posts where I have helped others interpret the modes to get a sense of how it works.

Best regards,


I’m working on Simulink interface, and as mentioned earlier (also noted in the ChangeLog.txt), the eigenanalysis.m had been replaced by GetMats.m and mbc3 but I cannot find these new files.

Based on the ChangeLog file, the replacement was made in FAST v6.02d-bjj on 10-Mar-2010 but I could not find any new files related to FAST linearization.

By the way, I’m running the latest version of FAST v7.

Thanks in advance,

Dear Ismail,

The MBC3 tool is available from: wind.nrel.gov/designcodes/postprocessors/mbc/.

Best regards,

Thanks a lot

Hello everybody.

I have calculated the natural frequency of the NREL 5MW onshore windturbine on a tubular steel properties as defined in test26.fst in FAST 8.15. I haven’t changed the blade and tower properties. I have done a linearization with FAST 7, then run the .lin file with MBC3 in matlab and then calculated the Campbell diagram with the Excel-sheet. I have compared the calculated natural frequencies for the different modes with the ones stated on p. 30 in “Definition of a 5-MW Reference Wind Turbine for Offshore System Development” and there is generally a good agreement, only the 1st blade edge (collective) is remarkably larger than the paper states. I have run the linearization with 0 and 12 rpm’s respectively. Has anyone else experienced the same problem and have an idea of sources of error/explanations for this?

Thanks in advance.


Jacob K. Pedersen
University of Southern Denmark
CampbellDiagram_onshore_5mw.zip (137 KB)

Dear Jacob,

Actually, while the 1st blade asymmetric edgewise mode natural frequencies (both pitch and yaw) are listed in the NREL 5-MW specifications report, the 1st blade collective edge mode natural frequency is not listed. From my brief look at your Campbell diagram spreadsheet, your frequencies are quite close to those reported.

Best regards,

Dear Jason.

I see, thank you very much.


Jacob K. Pedersen

Dear Jason,

Firstly, thank you for activating my account.

I’m new in FAST and I downloaded the last version (8.16) just last week.
As first analysis I wanted to obtain the Campbell Diagram of the 5MW Wind Turbine in order to compare my results with the ones obtained by one of my colleagues with FASTv7.
I have some questions about the results that I obtained.

At 0 RPM the frequencies are almost the same but the troubles begin when I increase the RPMs. In my analyses I chose 0, 2, 4, 6 RPMs and so on until 18. I noticed a strange behaviour of the frequencies associated with the blades: some increase really fast and some others decrease fast as well.

These are my results with FASTv8.16, obtained running GetMats_f8 and then mbc3.m on every *.lin file:
RPM 0 2 4 6
0.31958 0.31958 0.31954 0.31954 [Hz]
0.32409 0.32406 0.32399 0.32386
0.67560 0.64839 0.62000 0.59434
0.68442 0.70151 0.70621 0.71363
0.70073 0.71540 0.75237 0.79245
1.09224 1.06468 1.03177 0.99923
1.10408 1.13298 1.16686 1.20153
1.70153 1.70151 1.70198 1.70294
1.91915 1.90852 1.88759 1.86606
1.99185 2.00502 2.01981 2.02829
2.01519 2.01744 2.03664 2.07269
2.91844 2.91866 2.91931 2.92054
2.94340 2.94351 2.94378 2.94427

These are the results with FASTv7:
RPM 0 2 4 6
0.32181 0.32181 0.32179 0.32177 [Hz]
0.32490 0.32492 0.32497 0.32506
0.66696 0.66842 0.67280 0.67994
0.67581 0.67727 0.68167 0.68901
0.69189 0.69344 0.69804 0.70558
1.07934 1.08002 1.08033 1.08196
1.09033 1.09101 1.09169 1.09302
1.69516 1.69576 1.69602 1.69692
1.92108 1.92262 1.92708 1.93431
1.99733 1.99856 2.00348 2.01146
2.02111 2.02247 2.02734 2.03521
2.92752 2.92770 2.92823 2.92911
2.96265 2.96276 2.96300 2.96343

I obtained these results with this file.fst, with only one linearization at the end of the run time:

------- FAST v8.16.* INPUT FILE ------------------------------------------------ FAST Certification Test #18: NREL 5.0 MW Baseline Wind Turbine (Onshore) ---------------------- SIMULATION CONTROL -------------------------------------- false Echo - Echo input data to <RootName>.ech (flag) "FATAL" AbortLevel - Error level when simulation should abort (string) {"WARNING", "SEVERE", "FATAL"} 1000 TMax - Total run time (s) 0.0125 DT - Recommended module time step (s) 2 InterpOrder - Interpolation order for input/output time history (-) {1=linear, 2=quadratic} 0 NumCrctn - Number of correction iterations (-) {0=explicit calculation, i.e., no corrections} 99999 DT_UJac - Time between calls to get Jacobians (s) 1E+06 UJacSclFact - Scaling factor used in Jacobians (-) ---------------------- FEATURE SWITCHES AND FLAGS ------------------------------ 1 CompElast - Compute structural dynamics (switch) {1=ElastoDyn; 2=ElastoDyn + BeamDyn for blades} 0 CompInflow - Compute inflow wind velocities (switch) {0=still air; 1=InflowWind; 2=external from OpenFOAM} 0 CompAero - Compute aerodynamic loads (switch) {0=None; 1=AeroDyn v14; 2=AeroDyn v15} 0 CompServo - Compute control and electrical-drive dynamics (switch) {0=None; 1=ServoDyn} 0 CompHydro - Compute hydrodynamic loads (switch) {0=None; 1=HydroDyn} 0 CompSub - Compute sub-structural dynamics (switch) {0=None; 1=SubDyn} 0 CompMooring - Compute mooring system (switch) {0=None; 1=MAP++; 2=FEAMooring; 3=MoorDyn; 4=OrcaFlex} 0 CompIce - Compute ice loads (switch) {0=None; 1=IceFloe; 2=IceDyn} ---------------------- INPUT FILES --------------------------------------------- "5MW_Baseline/NRELOffshrBsline5MW_Onshore_ElastoDyn.dat" EDFile - Name of file containing ElastoDyn input parameters (quoted string) "5MW_Baseline/NRELOffshrBsline5MW_BeamDyn.dat" BDBldFile(1) - Name of file containing BeamDyn input parameters for blade 1 (quoted string) "5MW_Baseline/NRELOffshrBsline5MW_BeamDyn.dat" BDBldFile(2) - Name of file containing BeamDyn input parameters for blade 2 (quoted string) "5MW_Baseline/NRELOffshrBsline5MW_BeamDyn.dat" BDBldFile(3) - Name of file containing BeamDyn input parameters for blade 3 (quoted string) "5MW_Baseline/NRELOffshrBsline5MW_InflowWind_12mps.dat" InflowFile - Name of file containing inflow wind input parameters (quoted string) "5MW_Baseline/NRELOffshrBsline5MW_Onshore_AeroDyn15.dat" AeroFile - Name of file containing aerodynamic input parameters (quoted string) "5MW_Baseline/NRELOffshrBsline5MW_Onshore_ServoDyn.dat" ServoFile - Name of file containing control and electrical-drive input parameters (quoted string) "unused" HydroFile - Name of file containing hydrodynamic input parameters (quoted string) "unused" SubFile - Name of file containing sub-structural input parameters (quoted string) "unused" MooringFile - Name of file containing mooring system input parameters (quoted string) "unused" IceFile - Name of file containing ice input parameters (quoted string) ---------------------- OUTPUT -------------------------------------------------- True SumPrint - Print summary data to "<RootName>.sum" (flag) 1 SttsTime - Amount of time between screen status messages (s) 99999 ChkptTime - Amount of time between creating checkpoint files for potential restart (s) "default" DT_Out - Time step for tabular output (s) (or "default") 0 TStart - Time to begin tabular output (s) 1 OutFileFmt - Format for tabular (time-marching) output file (switch) {1: text file [<RootName>.out], 2: binary file [<RootName>.outb], 3: both} True TabDelim - Use tab delimiters in text tabular output file? (flag) {uses spaces if false} "ES10.3E2" OutFmt - Format used for text tabular output, excluding the time channel. Resulting field should be 10 characters. (quoted string) ---------------------- LINEARIZATION ------------------------------------------- True Linearize - Linearization analysis (flag) 1 NLinTimes - Number of times to linearize (-) [>=1] [unused if Linearize=False] 1000 LinTimes - List of times at which to linearize (s) [1 to NLinTimes] [unused if Linearize=False] 0 LinInputs - Inputs included in linearization (switch) {0=none; 1=standard; 2=all module inputs (debug)} [unused if Linearize=False] 0 LinOutputs - Outputs included in linearization (switch) {0=none; 1=from OutList(s); 2=all module outputs (debug)} [unused if Linearize=False] False LinOutJac - Include full Jacobians in linearization output (for debug) (flag) [unused if Linearize=False; used only if LinInputs=LinOutputs=2] False LinOutMod - Write module-level linearization output files in addition to output for full system? (flag) [unused if Linearize=False] ---------------------- VISUALIZATION ------------------------------------------ 0 WrVTK - VTK visualization data output: (switch) {0=none; 1=initialization data only; 2=animation} 1 VTK_type - Type of VTK visualization data: (switch) {1=surfaces; 2=basic meshes (lines/points); 3=all meshes (debug)} [unused if WrVTK=0] true VTK_fields - Write mesh fields to VTK data files? (flag) {true/false} [unused if WrVTK=0] 15 VTK_fps - Frame rate for VTK output (frames per second){will use closest integer multiple of DT} [used only if WrVTK=2]

As you can see I ran only ElastoDyn, and its input file is the same as in the archive but with different RotorSpeed.

Thank you in advance.

Best regards,
Matteo Strada

Dear Matteo,

The results you are getting out of FAST v8.16 make sense to me – the natural frequencies of the blade/rotor modes are affected by the rotor speed.

I don’t see the same effect from your results using FAST v7. Are you sure you’ve ran that FAST analysis and/or post-processed the results correctly?

Best regards,

Dear Jason,

Thank you for your reply.

What I am trying to achieve is the Campbell diagram with the “static” frequencies.
In other words, I need to know how the fundamental frequencies are increased by the centrifugal stiffening through the different RotorSpeeds.
Of course I am expecting the frequencies to be affected by the RotorSpeed, but not in a decreasing way in the purpouse of what I am searching for.

Here I’ll put the two diagrams:

Best regards,
Matteo Strada

Dear Matteo,

I would expect the regressive rotor modes to decrease with rotational speed.

I’ve attached a Campbell Diagram of the land-based NREL 5-MW turbine that I recently derived with FAST v8.16 (and matched to what was derived with FAST v7).

Best regards,

Dear Jason,

Thank you for having clarified my results.

Best regards,
Matteo Strada

Hi everybody,

I intend to perform a linearization of the NREL 5MW onshore, using the test18.fst. I am using FAST 8.16 and after doing the linearization I have tried running the GetMats_f8 command of the MBC-script in MATLAB. However, I get an error message:

Undefined function or variable ‘FileNames’.

Error in GetMats_f8 (line 16)
if isempty(FileNames)

I have created a directory containing the .lin-files from FAST8.16 inside the MBC-folder, which I have added to Matlab’s list of paths.
Any help would be greatly appreciated.

Dear Jacob,

Variable FileNames is specified at the top of GetMats_f8.m; set it to the name (or names) of the linearization output file(s) that you wish to process.

Best regards,

Dear Jason,

Thank you, I have specified FileName=‘test18.1.lin’ in MATLAB and then tried running GetMats_f8 again. Now, however, I get the following message:

[i]>> FileNames=‘test18.1.lin’

FileNames =


Cell contents reference from a non-cell array object.

Error in GetMats_f8 (line 24)
data(NAzimStep) = ReadFASTLinear(FileNames{1}); %we’ll read this twice so we can allocate space first; putting it at
NAzimStep saves some reallocation later