Hydrodynamic implementation

Dear Riccardo,

Yes, the ElastoDyn tower-base load outputs (TwrBsFxt, etc.) include contributions from mass/inertia of the rotor, nacelle, and tower, so, you’d be double counting those terms. Instead, you’d want to express the aerodynamic applied loads relative to the platform reference point (0,0,0).

Best regards,

Dear Jason,

I was wondering if there are any output of FAST that express the aerodynamic applied loads relative to the platform reference point (0,0,0).

Thanks for your reply. Best regards,

Dear Riccardo,

No, the aerodynamic applied loads are only output from AeroDyn v15 in the hub coordinate system (RtAeroFxh, etc.). You’d have to rotate these to the global coordinate system (accounting for deflection of the support structure and shaft tilt) and add the moment arm.

Best regards,

Dear Jason,
Starting from Test 24, I’m trying to verify the loads in the 6 DOFs in according to the formula:
M * a = Fhydro - Fmoor + Ftower - Fnonlinear - Frestoring

where is it:

M = variable mass matrix based on the position of the platform, obtained as indicated in the post reported here (11 July 2020)

a = [‘PtfmTAxi’, ‘PtfmTAyi’, ‘PtfmTAzi’, ‘PtfmRAxi’, ‘PtfmRAyi’, ‘PtfmRAzi’]

Fhydro = [‘HydroFxi’, ‘HydroFyi’, ‘HydroFzi’, ‘HydroMxi’, ‘HydroMyi’, ‘HydroMzi’]

Fmoor = [Fx [1] + Fx [2] + Fx [3] + Fx [4] + Fx [5] + Fx [6], Fy [1] + Fy [2] + Fy [3] + Fy [ 4] + Fy [5] + Fy [6], Fz [1] + Fz [2] + Fz [3] + Fz [4] + Fz [5] + Fz [6], Mx_moor, My_moor, Mz_moor]
with Mx_moor, My_moor, Mz_moor moments of transport of forces from Map ++ in (0,0,0)

Ftower forces and moments obtained starting at the rotor exits:
Fx_tow = ‘RtAeroFxh’
Fy_tow = ‘RtAeroFyh’ * cos (‘Azimuth’) - ‘RtAeroFzh’ * sin (‘Azimuth’)
Fz_tow = ‘RtAeroFzh’ * cos (‘Azimuth’) + ‘RtAeroFyh’ * sin (‘Azimuth’)
Mx_tow = ‘RotTorq’ * 1000
My_tow = ‘RtAeroMyh’ * cos (‘Azimuth’) - ‘RtAeroMzh’ * sin (‘Azimuth’)
Mz_tow = ‘RtAeroMzh’ * cos (‘Azimuth’) + ‘RtAeroMyh’ * sin (‘Azimuth’)
and were then rotated in the inertial reference system, with the addition of the transport moments and the weight of the turbine to have the forces at the base of the tower in (0,0,0)

Fnonlinear = given by omega x (omega x r_cm * mass) and omega x I dot omega, with
omega = [‘PtfmRVxi’, ‘PtfmRVyi’, ‘PtfmRVzi’],
r_cm * mass = [M (6,2), M (4,3), M (5,1)]
I = [M (4.4), M (4.5), M (4.6); M (5.4), M (5.5), M (5.6); M (6.4), M (6.5), M (6.6);]

Frestoring = where the weight of the platform and gravity restoring moments are considered [0, 0, M_plat, -M (5,1) * rx + M (6,2) * rz, -M (5,1) * ry + M (4.3) * rz] * g
with M = mass matrix variable according to the position

Comparing the sum of the loads in the 6 DOFs with the results in the 6 DOFs of the product M * a I obtain small differences, as shown in the figure.
(for example, I compared for the resultant in x:
M (1,1) * ‘PtfmTAxi’ + M (1,2) * ‘PtfmTAyi’ + M (1,3) * ‘PtfmTAzi’ + M (1,4) * ‘PtfmRAxi’ + M (1,5) * ‘PtfmRAyi’ + M (1,6) * ‘PtfmRAzi’
‘HydroFxi’ - Fmoor_x + Ftower_x - Fnonlinear_x - Frestoring_x)

Could you tell me what they are caused by?

All the rotations are expressed in Radiants.

Thank you a lot. Best regards,


Dear Riccardo,

Indeed, your results are quite close, with only some small differences. I don’t see any obvious errors in your approach, but I do have a few questions:

  • Why are you using RotTorq rather than RtAeroMxh?
  • In Frestoring, you haven’t stated what M_plat is (zero?) and the value of M should not change with displacement in this linearized equation, even though that is implied. That said, ElastoDyn does include some amount of nonlinearity in this equation, i.e. using the displaced center of mass using the transformation matrix given in Eq. (2) in my 2009 Wind Energy paper: onlinelibrary.wiley.com/doi/abs/10.1002/we.347.
  • I can’t check all of the details because they are not in your post (e.g., how the mass matrix changes with displacement, how Ftower is transformed to global coordinates, how MX_moor, etc. are calculated).
  • Could the problem simply be that of numerical round-off in the variables you are comparing?

Best regards,

Dear Jason,

Thanks for your prompt reply.

  • I used RotTrq to consider also the inertia of the rotor (I noted that in an Onshore Test the TwrBsMx= RotTrq+transport moments);
  • M_plat is the mass platform (M_plat=7466330 kg) since I consider the turbine weight in Fz_tower;
  • Mooring moments are obtained by multiply C_rot x F where:

-C_rot= X/Y/Z coordinates of the fairlead respect (0,0,0) in each time step.

-I obtained the mass matrix relative to the center of mass through the following inverse transformation: Mcg = (TransMat^T)^-1 * M_swl * TransMat^-1
(where TransMat is the one indicated in this topic "http://forums.nrel.gov/t/oc3-hywind-raos/1085/1 where the
inputs of the rotation matrix are those in still water). Then the mass matrix (in 0 0 0) relative to the position of the system is obtained by applying the
direct transformation M_swl = TransMat^T * Mcg * TransMat, using the current positions of Cg as the input of TransMat.

-We consider [Fx_tow Fy_tow Fz_tow Mx_tow My_tow Mz_tow] applied in (0,0,Rotor height) because I set: OverHang=ShftGagL=NacCMxn=NcIMUxn=0 so
I transported forces and moments in the system frame (0,0,0) integral to the structure then considering the platform rotation.

by setting the parameters OverHang=ShftGagL=NacCMxn=NcIMUxn=0, is it possible that the mass matrix changes?

Best regards,

Dear Riccardo,

Just a few comments:

  • I would use RtAeroMxh instead of RotTorq so as to not double count any inertial terms.
  • M_plat makes sense; thanks for clarifying.
  • I follow your calculation of M_swl, but this assumes linearity of the structural model. Again, ElastoDyn includes some nonlinearity in the platform rotations as I indicated in my prior post, which may result in some small differences to what you are calculating.
  • For Ftower, presumably you also consider the shaft tilt, unless this has also been zeroed.
  • I’m not sure I understand your last question about the mass matrix changes.

Best regards,

Dear Jason,
Thanks for the reply and for your help. First of all I forgot to clarify that in the Test I considered the rigid body, so for this reason I don’t have considered any nonlinearities. If there are non-linearities also for the rigid body case, how can I take them into account?
As for the mass matrix, I started from the one indicated in the post previously reported. However, I suspect that considering Overhang & Co. to be null, the moments of inertia and therefore the total mass matrix M_cg, as well as the position of the center of mass, can change.

Best regards,

Dear Riccardo,

Even the rigid body contains many nonlinear terms; that is, each term in Fhydro, Fmoor, Ftower, Fnonlinear, and Frestoring includes nonlinearities. Some of the nonlinearities are included in HydroDyn, MAP++, AeroDyn, etc. whose outputs you are using.

One of the nonlinearities I gather you are missing in your equations is how the rotation/orientation of the rigid body is handled in ElastoDyn, i.e. per Eq. (2) in the Wind Energy paper I referenced. This will impact, e.g., how aerodynamic loads are transferred to global in Ftower, how the CG is determined in Fnonlinear and Frestoring.

Best regards,

Dear Jason,
Starting from the same equations of Riccardo (corrected as you suggested in the last posts), I am investigating the differences in the transition from AeroDyn = 0 to AeroDyn = 2 with regards to platform movements.

Using the reported forces and moments output of FAST, I calculated positions in the 6 DOFs. When AeroDyn = 0, I get the same position trends in the 6 DOFs to the FAST outputs. When I switch to AeroDyn = 2, however, the only positions consistent with FAST are x, z, ry, while the other 3 (y, rx, rz) have a totally different trend, and with greater oscillation amplitudes.
I was wondering if there is any other contribution in moving from AeroDyn = 0 to AeroDyn = 2

Thanks for your attention,
Best regards,

Dear Lorenzo,

I’m sorry, but I’m not really sure I understand your question. By “AeroDyn = 0 or 2”, are you referring to “CompAero = 0 or 2”? And I’m not sure what you are comparing FAST to (your own model)? And I’m not sure what you mean by “any other contribution”?

Best regards,

Dear Jason,
Sorry, I was referring to CompAero = 0 or 2.
Adding all the forces and moments from outputs of FAST, then dividing by the mass matrix, I get the accelerations from which the positions in the 6 DOFs. Finally, I compare the positions thus obtained with the FAST outputs.
When I have CompAero = 0 the graphs are superimposed in the 6 DOFs, while with CompAero = 2 I have that the graphs of y, rx and rz do not replicate the FAST outputs well.
Since in both cases I use the same equation (in fact, I also take into account, in the case of CompAero = 0, the initial transient of the RotTrq, etc.), I wondered why in the case of CompAero = 2 it does not obtain equal trends in all DOFs but only in x, z, ry.
This is why I asked you if there are any other components of the equation, which I have neglected, that can motivate these inconsistencies in the positions y, rx, rz.
I hope I was clearer.
Best regards,

Dear Lorenzo,

OK, I think I understand now. But I’m not sure I have anything to add beyond what I’ve already discussed with Riccardo.

Best regards,

Dear Jason,
Thanks for checking.
I have tried to investigate further what can cause the differences between my outputs and those of FAST, and I have noticed that the cause is the resultant moment Mx.
In fact, I compared, for each DOF, that the equation was verified:
M * a = Fhydro + Fturbine + Fmoor - Frestoring - Fnonlinear
thus obtaining from the product M * a the resulting Fx, Fy, Fz, Mx, My, Mz which I had to obtain from the sum of the contributions to have the same accelerations as FAST.
To do this I used:

  • M: variable mass matrix with the movement of the platform
  • a: acceleration outputs of FAST (‘PtfmTAxi’, ‘PtfmTAyi’, ‘PtfmTAzi’, ‘PtfmRAxi’, ‘PtfmRAyi’, ‘PtfmRAzi’)
  • Fhydro: outputs FAST (‘HydroFxi’, ‘HydroFyi’ ‘HydroFzi’, ‘HydroMxi’, ‘HydroMyi’, ‘HydroMzi’)
  • Fturbine: forces at the base of the turbine tower, obtained starting from the aerodynamic forces / moments on the rotor (‘RtAeroFxh’, ‘RtAeroFyh’, ‘RtAeroFzh’, ‘RtAeroMxh’, ‘RtAeroMyh’, ‘RtAeroMzh’), transported in the fixed reference of the nacelle and then transported to the base of the tower.
  • Fmoor: starting from the forces in the 3 directions for each line obtained by MAP ++, the moments were obtained
  • Frestoring: where the contribution on Mx is given by m * x_g * ‘PtfmYaw’ - m * z_g * ‘PtfmRoll’ where m = total mass of the system, (x_g, y_g, z_g) coordinates of the center of mass with respect to the origin of the inertial reference system
  • Fnonlinear: as regards the moments, I used the formula omega x I dot omega (with omega = [‘PtfmRVxi’, ‘PtfmRVyi’, ‘PtfmRVzi’] and I: inertia matrix 3x3)

As you can see from the figures shown, I obtain summation trends of forces-moments that accurately overlap with the corresponding trend M * a in all directions, except on Mx.

This makes me make some considerations:

  • given that I get 5 out of 6 results, it is unlikely that there is an error of transport of the forces-moments in the turbine, of the calculation of the moments of the moorings from the forces or of the way in which I considered the restoring moment or the variation of the mass matrix . If there was an error I should have problems in other directions as well.
  • for the above reasons I have asked you in the past if there were other contributions to consider, in particular some effect that acts above all on Mx (and therefore can cancel this difference which I now find).

I hope I have clearly explained the problem to you,
Best regards,

Dear Lorenzo,

There should not be anything unique in OpenFAST regarding Mx. I agree with your calculations, with just two comments:

  • As I mentioned before, the equation you are using for Frestoring is linear, whereas ElastoDyn considers some nonlinearity here based on Eq. (2) in the Wind Energy paper I referenced above.
  • You don’t say this, but presumably the inertia matrix, I, is also variable with platform movement.

Best regards,

Dear Jason,
Yes, the inertia matrix varies with the movement of the platform.
I have consulted the paper you suggested. I think I understand that Equation 2 replaces Euler’s angles. However we use Euler angles to move to the inertial frame of reference (0,0,0), so this term should already be considered by us.
Furthermore, I don’t understand how Euler angles affect the non-linearity of the restoring moment.
Where can I find information about it?

Best regards,

Dear Lorenzo

The restoring moment can be written as

F_restoring = -r_g x { 0; 0; -m*g }


r_g = [ TransMat^T ]*{ x_g; y_g; z_g }

and TransMat^T is the transpose (inverse) of the orientation matrix documented in Eq. (2).

Best regards,

Dear Jason,
To better understand the reason for the divergence of the previously analyzed results (see quote), I chose to carry out an analysis only on the hydrodynamic part, thus setting CompAero = 0 and defining the initial rotor speed = 0. In this way it is possible to neglect the loads at the base of the turbine throughout the simulation.

The equation of dynamics then becomes:
M * a = Fhydro + Fmoor - Frestoring - Fnonlinear
where each component is defined as in the quote, with the exception of the restoring moment where the changes you suggest have been inserted.
As I did earlier, I have compared forces-moments with M * a in all directions:

Comparing the results, I recorded the following errors on the rms values:
Fx: 2,5% Fy: 2,4% Fz: 0,4% Mx: 15,1% My: 6,7% Mz: -99%
As you can see, Mx has a small error especially in the first part of the simulation. The resultant of Mz, on the other hand, is of the order of ten while the corresponding M * a has values of hundreds: I cannot understand the reason given that HydroMz, MoorMz and NonlinMz have values of the order of unity, while the restoring moment is null in rz direction.
Is there any advice you can give me?
Thanks for the attention,

Dear Lorenzo,

I’m not sure. Do you see yaw motion in this simulation? If so, I would expect nonzero moments to show up in Fhydro, Fmoor, and Fnonlinear.

Another thing I notice is that the yaw moments are very small relative to the roll, and especially the pitch, moments. This suggests that that numerical round in the calculations may have more of an influence on the yaw moment.

Best regards

Dear Jason,
Yaw is very small (order of 10^-8 degrees), this justifies the low values of Mz in Fhydro, Fmoor, and Fnonlinear.
To compare, roll order is about 10^-5 degrees, from which we can see the proportion between Mx and Mz: in fact, Mx is of the order of 10^4, while Mz should be 10^1 (not 10^2, as obtained with M*a).
I agree with you that it could therefore be a numerical error which becomes more evident in Mz due to the low values. The most important thing for me is not to have forgotten any contributions.
Best regards,