Dear @Jason.Jonkman,
I am having some trouble understanding the initial results from the simplified linearizations I am running.
For background context, I am using OpenFAST v4.2.0, rebuilt according to Issue #738, to eliminate the ‘AD User property on blade X’ inputs, since I don’t use them. I am running a linearization case similar to r-test-main/glue-codes/openfast/5MW_Land_Linear_Aero_CalcSteady, with the following major changes:
FST file
NLinTimes = 36
ElastoDyn
GenDOF = True (the rest are false)
RotSpeed = 9.156
AeroDyn
Skew_Mod = -1
DBEMT_Mod = -1
The complete linearization files can be found here:
For post-processing I am running fx_getMats from the MATLAB toolbox and my final averaged A matrix is showing that the system is unstable. If I perfom eig(A) in MATLAB I get:
0.0232
-0.0253
-
Is there anything incorrect in my linearization files?
-
If not, why is the system unstable, and what repercussions does this have for the model?
NOTE: I am getting pretty similiar eigenvalues (0.0207, -0.0228) and A matrices if I linearize with the clean version of OpenFAST v4.2.0.
Dear @Ignacio.Lopez,
I would guess the eigenvalue you are getting is simply the result of numerical round-off in the calculations and azimuth averaging. The generator azimuth state should no stiffness, and in fact, should represent a rigid-body mode, with zero natural frequency.
Normally, we recommend eliminating the generator-azimuth state (keeping the generator-speed state) to avoid including the rigid-body mode in the linearization solution. This topic has been discussed several times on this forum, e.g., see: FAST linearization V7.
Best regards,
Dear @Jason.Jonkman,
I have some questions:
1- When linearizing the wind turbine with 1 DOF (GenDOF =True), the system exhibits rigid-body motion meaning the ideal result should be A = [0 1; 0 0], but because of the round offs we can’t see that, right?
2- Before applying any control strategy, I am dealing with some other cases of linearizations with different numbers of DOFs. My objective is to achieve a result similar to the 5 MW onshore wind turbine model without any control applied, i.e setting in ServoDyn PCMode = 0, VSControl = 0 and YCMode = 0. Is this a feasible objective?
3- With some other cases of linearizations in Region 2 (wind speeds at 8, 9 and 10 m/s), I am simulating the time response in MATLAB with the lsim function. After eliminating the generator-azimuth state* I am checking the system response with no input and initial conditions equal to the OP. I’ve noticed that for the GenSpeed the result is a decreasing curve that settles around a speed not far from the starting point.
<<This picture represents the
GenSpeed for a linearization around 8 m/s with 9 DOFs.>>
I think this issue is related with the value of the x_dot vector, because it is non-zero it means there is some kind of acceleration (or deceleration). Later, when I set it to zero I get a straight line, just what I was expecting at first. Could you tell me more about this issue of non-zero x_dot vector? Is something normal or I am doing anything wrong?
This is all for the moment.
Thanks in advance.
*(to do so I am doing sys.A(:,1) = 0 and sys.A(1,:) = 0 supposing the generator-azimuth state position in the A matrix is a11; if this is not the correct way to eliminate the generator-azimuth state please let me know).
Dear @Jason.Jonkman,
Thank you for your quick response.
Regarding point 3.
I am setting my Operating Point (OP) for linearization at 8 m/s and using CalcSteady = True so that a periodic steady-state solution is found with the generator torque trimming. After the linearization is complete, I process the resulting matrices in MATLAB as previously discussed and proceed to compute the time response simulation data using lsim. Inside the state-space object in MATLAB, I am setting the Offsets property to match the OP conditions (dx0, x0, u0, y0) and supplying them to the system, expecting to obtain the same OP values. However, I am getting a decreasing curve, similar to the one shown in my last post.
My guess is that this issue is related with the value of the dx0 (sys_avg.Offsets.dx), as I am not getting values close to zero. For example, in a case with 3 DOFs (FlapDOF1, DrTrDOF and GenDOF) and OP at 8 m/s I get this vector sys_avg.Offsets.dx=
| Column 1 |
Column 2 |
| First time derivative of ED Variable speed generator DOF (internal DOF index = DOF_GeAz), rad/s |
0.957208807269731 |
| First time derivative of ED Drivetrain rotational-flexibility DOF (internal DOF index = DOF_DrTr), rad/s |
-1.55093357534139e-06 |
| First time derivative of ED 1st flapwise bending-mode DOF of blade 1 (internal DOF index = DOF_BF(1,1)), m/s |
-0.00371092795912390 |
| First time derivative of ED 1st flapwise bending-mode DOF of blade 2 (internal DOF index = DOF_BF(2,1)), m/s |
-0.00355478665893722 |
| First time derivative of ED 1st flapwise bending-mode DOF of blade 3 (internal DOF index = DOF_BF(3,1)), m/s |
-0.000967916670367775 |
| First time derivative of ED First time derivative of Variable speed generator DOF (internal DOF index = DOF_GeAz), rad/s/s |
8.24561950341405e-05 |
| First time derivative of ED First time derivative of Drivetrain rotational-flexibility DOF (internal DOF index = DOF_DrTr), rad/s/s |
-1.00317126150103e-05 |
| First time derivative of ED First time derivative of 1st flapwise bending-mode DOF of blade 1 (internal DOF index = DOF_BF(1,1)), m/s/s |
-0.0813969264369493 |
| First time derivative of ED First time derivative of 1st flapwise bending-mode DOF of blade 2 (internal DOF index = DOF_BF(2,1)), m/s/s |
-0.0916361007580479 |
| First time derivative of ED First time derivative of 1st flapwise bending-mode DOF of blade 3 (internal DOF index = DOF_BF(3,1)), m/s/s |
-0.126317434950786 |
What I mean is that if I am receiving these values, it should imply that the trimming process failed to find a true equilibrium point before starting the linearization. Consequently, the system was likely still accelerating or decelerating, resulting in a non-zero dx0. I am setting TMax = 600 s and the linearization begins at around 270 s.
What is your opinion about this issue that I am facing?
Best regards,
Dear @Ignacio.Lopez,
Regarding the trim solution, I would not expect the OP values to reach zero because the operating turbine should be time-periodic under rotor rotation. You can confirm if the solution is in fact periodic by plotting the time series. When you do this, do you see that the start-up transients have dissipated, leaving only the periodic response?
Regarding lsim, you should not be initializing with the actual OP values, but rather, perturbations about the OP, given that the linearized model is expressed in terms of perturbations about the OP. So, regardless of the actual OP values, the pertubations should be zero if the goal is to initialize the model at its OP.
Best regards,
Dear @Jason.Jonkman,
Yes, I do see the start-up transients dissipated, leaving only the periodic response.
I am currently encountering a discrepancy between my full nonlinear simulation and the linearization results. At a steady wind speed of 9 m/s, the trimmed GenTq values from the linearization do not match those obtained from the nonlinear simulation.
I begin simulating the FAST Certification Test #18: NREL 5.0 MW Baseline Wind Turbine (Onshore) from the r-test folder. With a steady wind speed of 9 m/s I am expecting the DISCON controller to find the real values of the variables. I get the following results:
RotSpeed = 10.06 rpm
GenSpeed = 976 rpm
GenTq = 24.37 kNm
Then, when I do the linearization with CalcSteady = True and TrimCase = 2 I get these results:
RotSpeed = 10.045 rpm
GenSpeed = 974.45 rpm
GenTq = 25.963 kNm
Why is there a difference between the two GenTq values while appling the same wind speed?
Due to this issue I can’t understand the results between my linearizations and the wind turbine without control. If I test the linearization with a step wind from 9 to 9.5 m/s and I try to simulate the Test #18 without control, but constant GenTq applied (VSControl=1, TimeGenOn=0 s , VS_RtTq=25.963 kNm, BldPitch=0 deg (for each blade) and VS_RtGnSp = VS_Rgn2K = VS_SlPc = 0.01) I get this graphs:
The constant GenTq for the no control case is 25.963 kNm, but that is making the WT to spin slower and thus creating that big gap. If I use 24.37 kNm for the constant GenTq the graphs become pretty much the same, i.e, the GenSpeed is very similar but due to different GenTq applied.
Could you help me understand this discrepancy?
Best regards,
Dear @Ignacio.Lopez,
Can you share the time series of RotSpeed, GenSpeed, and GenTq when you run with a steady 9 m/s wind speed and the DISCON controller enabled (as in Test #18) versus with CalcSteady = TRUE, TrimCase = 2, when the DISCON is disabled? I’m trying to understand what is happening to result in different steady-state solutions between the two cases.
Best regards,
Dear @Jason.Jonkman,
In the following link you can find the time series of the simulations I have talked about in my last post.
Just a quick description of what is inside of each folder:
- The first one is
5MW_Land_Linear_Aero_CalcSteady, i.e, CalcSteady = TRUE, TrimCase = 2, and the DISCON is disabled.
- The other one is
5MW_Land_step_wind_NO_DISCON which is the one I used to simulate a step wind with constant GenTq and compare the result with the linearized model in a MATLAB script.
Best regards,
Dear @Ignacio.Lopez,
I took a quick look, comparing the OpenFASTs between Test_#18_9mps and 5MW_Land_Linear_Aero_CalcSteady and I noticed differences in set-ups that likely explain the different generator torques between the two solutions. That is, ShftTilt is nonzero in the former and zero in the latter. I noticed other differences such as the YawDOF and unsteady airfoil aerodynamics (UA_Mod = 3) enabled in the former, but not in the latter, as well as different model time steps, but I expect it is the ShftTilt causing the biggest difference in results.
Best regards,
Dear @Jason.Jonkman,
Thank you so much for enlightening me.
I have identified the root cause.
I aim to obtain pretty similar results for the two steady-state solutions (trimming and DISCON-enabled steady wind speed simulation). I realized that was not happening because the reference I was using was the Test #18 simulations that use UA_Mod = 3 and for the linearizations it is only posible to use UA_Mod = 0, 4, 5, or 6. So I checked the values of GenSpeed and GenTq in Test #18 with the different values of UA_Mod and these are the results.
| UA_Mod |
GenTq (kNm) |
GenSpeed (rpm) |
| 0 |
25.24 |
994 |
| 3 |
24.37 |
976 |
| 4 |
25.2 |
993 |
| 5 |
25.6 |
1000 |
| 6 |
25.34 |
995.5 |
- What is happening with
UA_Mod = 3 to produce the lowest values of GenTq and GenSpeed?
(I have found some information about a similar issue here, is it related?)
- Which value of
UA_Mod should I use in Test #18 to establish the reference values for my initial conditions in subsequent linearizations?
Best regards,
Dear @Ignacio.Lopez,
I’m glad you identified the root cause.
Regarding (1), I agree that the issue you linked is causing the solution with UA_Mod = 3 to deviate from the others.
Regarding (2), the main thing I would recommend is to use the same value of UA_Mod in both cases. I would recommend using UA_Mod = 4 or 5 instead of 6. UA_Mod = 4 and 5 are similar, with 5 having an extra vortex state. See their documentation here: 4.3.8. Unsteady Aerodynamics — OpenFAST v5.0.0 documentation.
Best regards,