After importing CSV files into R Studio, the following constants need to be setup:
#Setup Bango constants
Bango_alpha <- 0.14
Bango_refheight <- 15
#Setup Coopers Gap constants
CG_alpha <- 0.16
CG_refheight <- 10
#Setup Turbine constants
Turbine_Nameplate_Output_kW <- 3800
CutInWindSpeed <- 3
CutOutWindSpeed <- 25
HubHeight <- 115
k <- 0.7
v0 <- 7.5
To adjust the raw wind data to the wind speed at the hub height of the turbine, we use the following formulae:
\[WindSpeed_{Hub}= WindSpeed_{Ref_{Site}} . ( \frac{Height_{Hub}}{Height_{Ref_{Site}}})^\alpha\]
#Correct Bango Wind Speed
Bango$wind_speed_hub <- Bango$`wind_speed (m/s)`*(HubHeight/Bango_refheight)^Bango_alpha
tibble(Bango)
## # A tibble: 8,760 × 3
## local_time `wind_speed (m/s)` wind_speed_hub
## <chr> <dbl> <dbl>
## 1 1/01/2019 0:00 3.84 5.11
## 2 1/01/2019 1:00 4.76 6.34
## 3 1/01/2019 2:00 5.43 7.23
## 4 1/01/2019 3:00 5.41 7.19
## 5 1/01/2019 4:00 4.93 6.56
## 6 1/01/2019 5:00 4.29 5.71
## 7 1/01/2019 6:00 3.83 5.10
## 8 1/01/2019 7:00 3.10 4.13
## 9 1/01/2019 8:00 1.94 2.58
## 10 1/01/2019 9:00 2.61 3.48
## # ℹ 8,750 more rows
#Correct Coopers Gap Wind Speed
Coopers_Gap$wind_speed_hub <- Coopers_Gap$`wind_speed (m/s)`*(HubHeight/CG_refheight)^CG_alpha
tibble(Coopers_Gap)
## # A tibble: 8,760 × 3
## local_time `wind_speed (m/s)` wind_speed_hub
## <chr> <dbl> <dbl>
## 1 1/01/2019 0:00 1.81 2.67
## 2 1/01/2019 1:00 1.58 2.34
## 3 1/01/2019 2:00 1.70 2.52
## 4 1/01/2019 3:00 2.08 3.07
## 5 1/01/2019 4:00 2.41 3.56
## 6 1/01/2019 5:00 2.66 3.93
## 7 1/01/2019 6:00 2.82 4.17
## 8 1/01/2019 7:00 3.68 5.45
## 9 1/01/2019 8:00 4.54 6.71
## 10 1/01/2019 9:00 4.83 7.14
## # ℹ 8,750 more rows
The equation to calculate Power Output for the example turbine is:
\[TurbinePower_{kW} = \frac{3800}{1+e^{-k(v-v0)}}\]
#Calculate power output of turbine at Bango
Bango$power_kW <- 3800/(1+exp(-k*(Bango$wind_speed_hub-v0)))
#Correct for Cut In and Cut Out Wind Speed
Bango$power_kW <- ifelse(Bango$wind_speed_hub<CutInWindSpeed | Bango$wind_speed_hub>CutOutWindSpeed, 0, Bango$power_kW)
#Format local_time as date_time object
Bango$date_time <- as.POSIXct(strptime(Bango$local_time, tz = "", format = "%d/%m/%Y %H:%M"))
#filter values for first week of the year
start_time <- as.POSIXct("01-01-2019 00:00:00", tz = "", format = "%d-%m-%Y %H:%M:%S")
end_time <- as.POSIXct("07-01-2019 23:00:00", tz = "", format = "%d-%m-%Y %H:%M:%S")
# Use subset function to filter the data
Bango_subset <- subset(Bango, date_time >= start_time & date_time <= end_time)
#plot of subset
BangoPlot <- ggplot(Bango_subset, aes(x = date_time, y = power_kW)) +
geom_line() +
#labels for chart
labs(x="Date Time", y="Power (kW)",
title = "Power Output for Wind Turbine at Bango") +
#change x-axis for datetime
scale_x_datetime(date_breaks = "12 hours", date_labels = "%b %d %H:%M", expand = c(0, 0) ) +
#centre chart title and change angle of x-axis labels
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1))
#print plot
print(BangoPlot)
#Calculate power output of turbine at Coopers Gap
Coopers_Gap$power_kW <- 3800/(1+exp(-k*(Coopers_Gap$wind_speed_hub-v0)))
#Correct for Cut In and Cut Out Wind Speed
Coopers_Gap$power_kW <- ifelse(Coopers_Gap$wind_speed_hub<CutInWindSpeed | Coopers_Gap$wind_speed_hub>CutOutWindSpeed, 0, Coopers_Gap$power_kW)
#Format local_time as date_time object
Coopers_Gap$date_time <- as.POSIXct(strptime(Coopers_Gap$local_time, tz = "", format = "%d/%m/%Y %H:%M"))
# Use subset function to filter the data
Coopers_Gap_subset <- subset(Coopers_Gap, date_time >= start_time & date_time <= end_time)
#plot of subset
CGPlot <- ggplot(Coopers_Gap_subset, aes(x = date_time, y = power_kW)) +
geom_line() +
#labels for chart
labs(x="Date Time", y="Power (kW)",
title = "Power Output for Wind Turbine at Coopers Gap") +
#change x-axis for datetime
scale_x_datetime(date_breaks = "12 hours", date_labels = "%b %d %H:%M", expand = c(0, 0) ) +
#centre chart title and change angle of x-axis labels
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1))
print(CGPlot)
The equation to calculate Power Extracted for the example turbine is:
\[TurbinePowerExtracted_{kW} = \frac{1}{2}\rho A V^3 C_p \frac{1}{1000}\]
where \(\rho\) = air density = 1.2 kg/m3
A = swept area of fan = \(\pi \frac{D^2}{4}\)
V = wind speed
\(C_p\) = Coefficient of Performance
#set constants
AirDensity <- 1.2
Diameter <- 130
Cp <- 0.202
#calculate area of fan
area_fan <- pi*(Diameter^2)/4
#Calculate power extracted for a turbine at Bango
Bango$power_extracted_kW <- 0.5/1000*AirDensity*area_fan*Cp*((Bango$wind_speed_hub)^3)
#Correct for Cut In and Cut Out Wind Speed
Bango$power_extracted_kW <- ifelse(Bango$wind_speed_hub<CutInWindSpeed | Bango$wind_speed_hub>CutOutWindSpeed, 0, Bango$power_extracted_kW)
# Use subset function to filter the data
Bango_subset <- subset(Bango, date_time >= start_time & date_time <= end_time)
#plot of subset
BangoPlot <- ggplot() +
geom_line(data = Bango_subset, aes(x = date_time, y = power_kW, color="Power_calculated")) +
geom_line(data = Bango_subset, aes(x = date_time, y = power_extracted_kW, color="Power_Cp"))+
scale_color_manual(values = c("Power_calculated" = "blue", "Power_Cp" = "red"))+
guides(color = guide_legend(title = "Line Type", nrow = 2, ncol=2))+
#labels for chart
labs(x="Date Time", y="Power (kW)",
title = "Calculated vs Extracted Power for Wind Turbine at Bango") +
#change x-axis for datetime
scale_x_datetime(date_breaks = "12 hours", date_labels = "%b %d %H:%M", expand = c(0, 0)) +
#centre chart title and change angle of x-axis labels
theme(plot.title = element_text(hjust = 0.5),axis.text.x = element_text(angle = 45, hjust = 1))
#print plot
print(BangoPlot)
#Calculate power extracted for a turbine at Coopers Gap
Coopers_Gap$power_extracted_kW <- 0.5/1000*AirDensity*area_fan*Cp*((Coopers_Gap$wind_speed_hub)^3)
#Correct for Cut In and Cut Out Wind Speed
Coopers_Gap$power_extracted_kW <- ifelse(Coopers_Gap$wind_speed_hub<CutInWindSpeed | Coopers_Gap$wind_speed_hub>CutOutWindSpeed, 0, Coopers_Gap$power_extracted_kW)
# Use subset function to filter the data
Coopers_Gap_subset <- subset(Coopers_Gap, date_time >= start_time & date_time <= end_time)
#plot of subset
CGPlot <- ggplot() +
geom_line(data = Coopers_Gap_subset, aes(x = date_time, y = power_kW, color="Power_calculated")) +
geom_line(data = Coopers_Gap_subset, aes(x = date_time, y = power_extracted_kW, color="Power_Cp"))+
scale_color_manual(values = c("Power_calculated" = "blue", "Power_Cp" = "red"))+
guides(color = guide_legend(title = "Line Type", nrow = 2, ncol=2))+
#labels for chart
labs(x="Date Time", y="Power (kW)",
title = "Calculated vs Extracted Power for Wind Turbine at Coopers Gap") +
#change x-axis for datetime
scale_x_datetime(date_breaks = "12 hours", date_labels = "%b %d %H:%M", expand = c(0, 0) ) +
#centre chart title and change angle of x-axis labels
theme(plot.title = element_text(hjust = 0.5),axis.text.x = element_text(angle = 45, hjust = 1))
#print plot
print(CGPlot)
The annual energy output for each site can be calculated as:
\[AnnualEnergy = \sum_{t=0}^{8760} Power_{hour window} * time \]
The average power output for each site can be calculated as:
\[AveragePower = \frac{AnnualEnergyOutput}{24 * 365}\] The capacity factor for each site can be calculated as:
\[CapacityFactor = \frac{AveragePower}{NameplatePower} \]
#calculate annual energy output for Bango
annualEnergyOutput_Bango_MWh <- round((sum(Bango$power_kW))/1000,digits = 1)
#calculate average power for Bango
averagePowerOutput_Bango_kW <- round(annualEnergyOutput_Bango_MWh/(24*365)*1000, digits = 1)
#calculate capacity factor for Bango
capacityFactor_Bango <- round(averagePowerOutput_Bango_kW/Turbine_Nameplate_Output_kW*100, digits = 1)
#calculate annual energy output for Coopers Gap
annualEnergyOutput_CG_MWh <- round((sum(Coopers_Gap$power_kW))/1000, digits=1)
#calculate average power for Coopers Gap
averagePowerOutput_CG_kW <- round(annualEnergyOutput_CG_MWh/(24*365)*1000, digits=1)
#calculate capacity factor for Coopers Gap
capacityFactor_CG <- round(averagePowerOutput_CG_kW/Turbine_Nameplate_Output_kW*100, digits = 1)
#tabularise results
Results <- c("Annual Energy Output (MWh)","Average Power Output (kW)","Capacity Factor (%)")
annualFigures_Bango <- c(annualEnergyOutput_Bango_MWh,averagePowerOutput_Bango_kW,capacityFactor_Bango)
annualFigures_CG <-c(annualEnergyOutput_CG_MWh,averagePowerOutput_CG_kW,capacityFactor_CG)
annualFiguresTable <- data.frame(Results,annualFigures_Bango,annualFigures_CG)
knitr::kable(annualFiguresTable,caption = "Annual Figures for Bango and Coopers Gap")
| Results | annualFigures_Bango | annualFigures_CG |
|---|---|---|
| Annual Energy Output (MWh) | 7980.1 | 15766.4 |
| Average Power Output (kW) | 911.0 | 1799.8 |
| Capacity Factor (%) | 24.0 | 47.4 |
Based upon the annual figures from Task 4, my preferred wind site is Coopers Gap which has almost double the annual energy output, power and capacity factor for the same turbine.
Unfortunately, the average power coefficient for the selected turbine is 20.2%. This is well below the theoretical Betz Limit for power coefficient of a wind turbine, which is 59.26%.
This is further shown when compared to current wind turbines such as the Vestas v172-7.2MW, which has a nameplate capacity that is almost double the wind turbine examined above.
It is therefore recommended that a deeper investigation into LCOE for various wind turbines be conducted.