C_lalpha vs C_nalpha mismatch

Dear all,

I’m getting the following UA validation messages when initializing AeroDyn with UA enabled:

FAST_InitializeAll:AD_Init:Init_BEMTmodule:BEMT_Init:UA_Init:UA_SetParameters:
UA_ValidateAFI:File “…/AOC/Airfoils/18.7.dat”:
Large difference between C_lalpha and C_nalpha. C_lalpha=-4.6429 C_nalpha=6.7986.
We advise to check these values or provide them in the input file.

From a manual obtention of Cl vs α around α ≈ α0, I get C_lalpha ≈ 6.81 /rad, very close to C_nalpha ≈ 6.7986 /rad, which is the value in my airfoil.
However, UA reports C_lalpha = −4.6429 /rad during UA_ValidateAFI, so it looks like the inference window is picking points near stall instead of the linear region. This error only occurs in two of the 24 airfoils I have.

So my questions are the next ones:

  1. How does UA choose the α-range to infer C_lalpha during UA_ValidateAFI?
  2. Is there a supported way to explicitly set C_lalpha (as we can for C_nalpha)?

If you notice any errors in the airfoil attached below that could lead to this problem, I would be very grateful if you could point them out to me.

! ------------ AirfoilInfo v1.01.x Input File ----------------------------------
! AOC 15/50
! S812 Rn 2,000,000
! note that this file uses Marshall Buhl’s new input file processing; start all comment lines with !
! ------------------------------------------------------------------------------
“DEFAULT” InterpOrd ! Interpolation order to use for quasi-steady table lookup {1=linear; 3=cubic spline; “default”} [default=1]
1 NonDimArea ! The non-dimensional area of the airfoil (area/chord^2) (set to 1.0 if unsure or unneeded)
0 NumCoords ! The number of coordinates in the airfoil shape file. Set to zero if coordinates not included.
! … x-y coordinates are next if NumCoords > 0 …
“unused” BL_file ! The file name including the boundary layer characteristics of the profile. Ignored if the aeroacoustic module is not called.
1 NumTabs ! Number of airfoil tables in this file.
! ------------------------------------------------------------------------------
! data for table 1
! ------------------------------------------------------------------------------
3 Re ! Reynolds number in millions
0 UserProp ! User property (control) setting
True InclUAdata ! Is unsteady aerodynamics data included in this table? If TRUE, then include 32 UA coefficients below this line
!..
-2.5 alpha0 ! 0-lift angle of attack, depends on airfoil.
10 alpha1 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA>alpha0. (deg)
-13.5 alpha2 ! Angle of attack at f=0.7, (approximately the stall angle) for AOA<alpha0. (deg)
1 eta_e ! Recovery factor in the range [0.85 - 0.95] used only for UAMOD=1, it is set to 1 in the code when flookup=True. (-)
6.7986 C_nalpha ! Slope of the 2D normal force coefficient curve. (1/rad)
“Default” T_f0 ! Initial value of the time constant associated with Df in the expression of Df and f’‘. [default = 3]
“Default” T_V0 ! Initial value of the time constant associated with the vortex lift decay process; it is used in the expression of Cvn. It depends on Re,M, and airfoil class. [default = 6]
“Default” T_p ! Boundary-layer,leading edge pressure gradient time constant in the expression of Dp. It should be tuned based on airfoil experimental data. [default = 1.7]
“Default” T_VL ! Initial value of the time constant associated with the vortex advection process; it represents the non-dimensional time in semi-chords, needed for a vortex to travel from LE to trailing edge (TE); it is used in the expression of Cvn. It depends on Re, M (weakly), and airfoil. [valid range = 6 - 13, default = 11]
“Default” b1 ! Constant in the expression of phi_alpha^c and phi_q^c. This value is relatively insensitive for thin airfoils, but may be different for turbine airfoils. [from experimental results, defaults to 0.14]
“Default” b2 ! Constant in the expression of phi_alpha^c and phi_q^c. This value is relatively insensitive for thin airfoils, but may be different for turbine airfoils. [from experimental results, defaults to 0.53]
“Default” b5 ! Constant in the expression of K’‘’_q,Cm_q^nc, and k_m,q. [from experimental results, defaults to 5]
“Default” A1 ! Constant in the expression of phi_alpha^c and phi_q^c. This value is relatively insensitive for thin airfoils, but may be different for turbine airfoils. [from experimental results, defaults to 0.3]
“Default” A2 ! Constant in the expression of phi_alpha^c and phi_q^c. This value is relatively insensitive for thin airfoils, but may be different for turbine airfoils. [from experimental results, defaults to 0.7]
“Default” A5 ! Constant in the expression of K’‘’_q,Cm_q^nc, and k_m,q. [from experimental results, defaults to 1]
0 S1 ! Constant in the f curve best-fit for alpha0<=AOA<=alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1]
0 S2 ! Constant in the f curve best-fit for AOA> alpha1; by definition it depends on the airfoil. [ignored if UAMod<>1]
0 S3 ! Constant in the f curve best-fit for alpha2<=AOA< alpha0; by definition it depends on the airfoil. [ignored if UAMod<>1]
0 S4 ! Constant in the f curve best-fit for AOA< alpha2; by definition it depends on the airfoil. [ignored if UAMod<>1]
1.18 Cn1 ! Critical value of C0n at leading edge separation. It should be extracted from airfoil data at a given Mach and Reynolds number. It can be calculated from the static value of Cn at either the break in the pitching moment or the loss of chord force at the onset of stall. It is close to the condition of maximum lift of the airfoil at low Mach numbers.
-0.93 Cn2 ! As Cn1 for negative AOAs.
“Default” St_sh ! Strouhal’s shedding frequency constant. [default = 0.19]
0.0062 Cd0 ! 2D drag coefficient value at 0-lift.
-0.0402 Cm0 ! 2D pitching moment coefficient about 1/4-chord location, at 0-lift, positive if nose up. [If the aerodynamics coefficients table does not include a column for Cm, this needs to be set to 0.0]
0 k0 ! Constant in the \hat(x)_cp curve best-fit; = (\hat(x)_AC-0.25). [ignored if UAMod<>1]
0 k1 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1]
0 k2 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1]
0 k3 ! Constant in the \hat(x)_cp curve best-fit. [ignored if UAMod<>1]
0 k1_hat ! Constant in the expression of Cc due to leading edge vortex effects. [ignored if UAMod<>1]
“Default” x_cp_bar ! Constant in the expression of \hat(x)_cp^v. [ignored if UAMod<>1, default = 0.2]
“Default” UACutout ! Angle of attack above which unsteady aerodynamics are disabled (deg). [Specifying the string “Default” sets UACutout to 45 degrees]
“DEFAULT” filtCutOff ! Reduced frequency cut-off for low-pass filtering the AoA input to UA, as well as the 1st and 2nd derivatives (-) [default = 0.5]
!..
! Table of aerodynamics coefficients
154 NumAlf ! Number of data lines in the following table
! Alpha Cl Cd Cm
! (deg) (-) (-) (-)

Thank you for your time.

Kind regards,

Kepa

Dear @Jason.Jonkman,

I would be very grateful if you could help me solve this problem.

Kind regards,
Kepa

Dear @Kepa.Cueto,

I have circulated your question internally and am awaiting a response.

Best regards,

For debugging these, I like to use the unsteady_aerodynamic_driver, with the given polar, and set WrAFITables=True.

The driver will output the polars back with additional columns for the linear regions and the separated functions.

I haven’t looked at the implementation of the C_lalpha yet.

Yes, you can specify your own C_lalpha value in the airfoil file (instead of having it calculated internally). It should be placed on the line between C_nalpha and T_f0:

The calculations of these UA parameters have changed a bit in different versions, but the latest one should be doing a least-squares fitting of the Cl curve in the region defined by a lower and upper alpha, which are chosen based on the maximum slope of a smoothed Cn curve between +/- 20 degrees. The values of alpha that define the range where the least-squares fitting occurs are reported in the UA summary file as alphaLower and alphaUpper. (You can also specify these values directly in the airfoil file between alpha2 and eta_e.) The slope of the least-squares fit of the Cl curve is C_lalpha and the slope of the least-squares fit of the Cn curve is C_nalpha. The default alpha0 is also calculated from the least-squares fit of the Cn curve.

There was an AFI_Driver.f90 source code that allowed a user to look at what parameters OpenFAST calculates for each airfoil, but I don’t see that in the OpenFAST repo.

1 Like

Thank you very much to all three of you for your responses.

I have used the unsteady_aerodynamic_driver and it has given me a clearer picture.
On the other hand, I have seen in the profile data example uploaded to openfast.readthedocs that, according to what it says, these lines are optional, and if they are missing, OpenFAST calculates them internally from the polar:

My question is:

Is it advisable to fill in these parameters manually (for example, based on what the unsteady_aerodynamic_driver returns or on our own calculations) in order to have greater control and detail, or is it better to leave them blank and let OpenFAST calculate them automatically during the simulation?

What I want to understand is whether specifying them explicitly improves the reliability of the simulations, or whether in practice most users rely on OpenFAST’s internal calculation.

Thank you for your time.

Kind regards,

Kepa

Dear @Kepa.Cueto,

I would guess many OpenFAST users are running models developed by others and they will not change these values. And many of those that have to develop their own OpenFAST model would rely on the defaults and internally calculated values. I would also guess those who do set their own values are those that are experts in unsteady airfoil aerodynamics or those who have data to validate the unsteady airfoil hysteresis loops against.

Best regards,

Dear @Bonnie.Jonkman and @Emmanuel.Branlard,

I would like to confirm how OpenFAST internally computes the Unsteady Aerodynamic (UA) parameters when InclUAdata = False in the airfoil tables.

From my understanding, OpenFAST needs to determine parameters such as alpha0, alpha1, alpha2, eta_e, Cl_alpha, Cn_alpha, and the various constants (T_f0, T_V0, T_p, T_VL, etc.). Those same parameters are also output by the Unsteady_Aerodynamic_Driver when it runs with a given airfoil file.

Given that:

  • The UA.sum files produced by OpenFAST contain exactly the same parameters (with the same names and structure) as the driver output, and the results of my own tests using the driver matches almost perfectly the internal OpenFAST results.

Could you please confirm whether OpenFAST internally executes (or reproduces) the Unsteady_Aerodynamic_Driver routines to calculate these parameters during initialization? In other words, does OpenFAST internally run the same parameter-calculation logic as the standalone driver, or is it only partially implemented?

Thank you very much for your time and clarification.

Best regards,

Kepa

Both OpenFAST and the UnsteadyAero driver executables call the same code to calculate those parameters during initialization (you can see the code in AirfoilInfo.f90’s CalculateUACoeffs() subroutine). They should give you the same results for the same airfoil and UA model.

2 Likes