NREL / floris

A controls-oriented engineering wake model.
http://nrel.github.io/floris
BSD 3-Clause "New" or "Revised" License
213 stars 156 forks source link

Suggestion to use air density-corrected wind speed to determine power and Ct #211

Open ejsimley opened 3 years ago

ejsimley commented 3 years ago

Bug description Currently changing the air density parameter scales the entire power curve up or down. A more realistic approach would be to use an air density-corrected wind speed to determine power. This would shift the wind speed at which rated power is reached, but the turbine would still achieve the same rated power.

To Reproduce This code produces the following plot, illustrating how the entire power curve is scaled

import floris as fl
import numpy as np
from matplotlib import pyplot as plt

fi = fl.tools.floris_interface.FlorisInterface("example_input.json")
ws = np.arange(0.,21.,1.)
pc = fi.get_power_curve(ws)
fi.reinitialize_flow_field(air_density=1.)
pc1 = fi.get_power_curve(ws)

plt.figure()
plt.plot(ws,pc,label='Air Density = 1.225')
plt.plot(ws,pc,label='Air Density = 1.0')
image

Expected behavior The change in the power curve expected from the reduction in air density is as follows. Rated power is still achieved, but at a higher wind speed.

image

A proposed solution (in turbine.py) is to scale the wind speed to create an air-density corrected wind speed used to determine power. A similar approach could be used to determine Ct. This implies that the Cp and Ct curves that are defined should be the standard sea-level values.

# Compute the air density-corrected yaw effective velocity
pW = self.pP / 3.0  # Convert from pP to w
yaw_effective_velocity = ((self.air_density/1.225)**(1/3)) * self.average_velocity * cosd(self.yaw_angle) ** pW

# Now compute the power
return (
    1.225
    * self.powInterp(yaw_effective_velocity)
    * self.turbulence_parameter
)
paulf81 commented 2 years ago

Hi @ejsimley , the correction to power based on air density is included in V3. For Ct, I'm not sure if the same fix is appropriate. Here is the power curve for the NREL 5MW:

image

based on the current implementation, if air density is decreasing, effective wind speed decreases and, assuming we start in above rated winds, the power will drop once the effective wind speed crosses the rated wind speed. For ct:

image

Ct will increase with decreasing effective wind speed, which perhaps makes sense, the turbine is increasing its relative capture of the available resource (in above rated winds) as air density decreases. Should we just implement as was done for cp?

ejsimley commented 2 years ago

@paulf81 I think you're right. Assuming Ct is always computed using the Ct method in the turbine class, then I'd suggest using the following effective velocity when interpolating Ct. So at this line: https://github.com/NREL/floris/blob/9663a62c2c5d995fec458aea057af7b0de1a6b04/floris/simulation/turbine.py#L185 instead use:

effective_velocity = ((air_density/1.225)**(1/3)) * average_velocity(velocities)

So I guess air_density would need to be added as an argument to the Ct method?

rafmudaf commented 1 year ago

@ejsimley Thanks for calling this out. We can add air density to the Ct calculation like you suggest.

yinghanguan commented 7 months ago

@ejsimley感谢您指出这一点。我们可以按照您的建议将空气密度添加到 Ct 计算中。

In floris, what parameter can be controlled to change the pitch angle of the turbine and hence its active power?
What do ct and cp mean in the code? Are they bearing thrust coefficients and fan power factors?

misi9170 commented 2 months ago

@ejsimley @paulf81 Just revisiting this conversation; in v4, while the air density correction is applied for the power() calculation, it is not applied for the thrust_coefficient() calculation.

For example, see the power() and thrust_coefficient() methods of the SimpleTurbine operation model.

I see that I even left a TODO note when implementing this (I don't think it ever did go into the Ct calculation in v3).

@ejsimley , is your suggestion to just go ahead and add the same rotor_velocity_air_density_correction as is used in the power() calculation to the thrust_coefficient() calculation? rotor_velocity_air_density_correction() uses the **(1/3) exponent to the air density ratio that you mentioned in your comment above, and air_density is available to thrust_coefficient(), so there is no issue there. However, for the thrust coefficient case, shouldn't the exponent be **(1/2) instead? This would lead to a different "effective" velocity depending on whether it is power or thrust being calculated, which does feel a little strange.

ejsimley commented 2 months ago

@ejsimley感谢您指出这一点。我们可以按照您的建议将空气密度添加到 Ct 计算中。

In floris, what parameter can be controlled to change the pitch angle of the turbine and hence its active power? What do ct and cp mean in the code? Are they bearing thrust coefficients and fan power factors?

@yinghanguan, apologies for the delay in replying. I believe your first question was answered in discussion #855. Is that correct? In the code Ct and Cp represent the coefficient of thrust and coefficient of power, which can be used to determine the power and thrust of the wind turbine along with wind speed, air density, and rotor area. The coefficient of power is no longer used as an input to FLORIS, however. Instead the power curve as a function of wind speed is specified directly. The coefficient of thrust is used to determine wake velocity deficits and wake deflection in the wake models.