Windfarm Processing
Processing of the windfarm database consists of filtering the data, adding powercurve, and adding missing data
Add functions to the path
Load Windturbine Data
filename = 'TheWindPowerDatabaseWithRotorParameters23Mar.csv';
opts = detectImportOptions(['WT_data/' filename],'Encoding','UTF-8');
t=readtable(['WT_data/' filename],opts);
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
Basic Filtering
Remove offshore turbine
t(~strcmp(t.Offshore_Shore_distance,'No'),:)=[];
Remove turbine not in production (i.e., Construction, Planned, Approved or dismantled)
t(~strcmp(t.Status,'Production'),:)=[];
Remove data without location information
t(isnan(t.Latitude) | isnan(t.Longitude),:)=[];
Remove data outside of study area as defined by the bird datase.
To do that, we first assign to each windfarm the grid id of its location in the bird database and then we filter for windfarm further than 50km from the closest grid id.
load('../2018/data/Density_estimationMap','g');
[dist,grid_id] = min(pdist2([g.lat2D(g.latlonmask) g.lon2D(g.latlonmask)],[t.Latitude t.Longitude],@lldistkm));
Display table
t
t = 12518×34 table
| ID | Continent | ISO_code | Country | State_code | Area | City | Name | X2nd_name | Latitude | Longitude | Altitude_Depth | Location_accuracy | Offshore_Shore_distance | Manufacturer | Turbine | Hub_height | Number_of_turbines | Total_power | Developer | Operator | Owner | Commissioning_date | Status | Decommissioning_date | Link | Update | turbine_make | turbine_capacity | turbine_rotorDiameter |
---|
1 | 1256 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Niederösterreich' | 'Ertl' | 'Ertl' | 'NA' | 47.9670 | 14.6600 | 'NA' | 'Yes' | 'No' | 'Enercon' | 'E40/500' | 65 | 1 | 500 | 'NA' | 'Prenn Franz' | 'NA' | 2000 | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Enercon' | 500 | 40.3000 |
---|
2 | 1247 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Eberschwang' | 'Eberschwang' | 'NA' | 48.1450 | 13.5190 | '620' | 'Yes' | 'No' | 'Enercon' | 'E40/500' | 50 | 2 | 1000 | 'Windkraft Innviertel GmbH/EWS Consulting' | 'Windkraft Innviertel GmbH' | 'NA' | NaN | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Enercon' | 500 | 40.3000 |
---|
3 | 1252 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Laussa' | 'Laussa' | 'Plattenberg' | 47.9520 | 14.4920 | 'NA' | 'Yes' | 'No' | 'Tacke' | 'TW-600' | 50 | 3 | 1800 | 'EWS Consulting' | 'Energie AG' | 'Erneuerbare Energie Laussa GmbH' | 1996 | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Tacke' | 600 | 43 |
---|
4 | 16707 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Munderfing' | 'Munderfing' | 'Kobernaußerwald' | 48.0550 | 13.2420 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V112/3000' | 140 | 5 | 15000 | 'NA' | 'NA' | 'Municipality of Munderfing/EWS Consulting' | NaN | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Vestas' | 3000 | 112 |
---|
5 | 1251 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Oberrödham' | 'Oberrödham' | 'NA' | 48.3300 | 13.6620 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V47/660' | 65 | 3 | 1980 | 'EWS Consulting' | 'Energie AG' | 'NA' | 1999 | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Vestas' | 660 | 47 |
---|
6 | 1254 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Schenkenfelden' | 'Schenkenfelden' | 'NA' | 48.5100 | 14.3500 | 'NA' | 'Yes' | 'No' | 'Micon' | 'M1800-600/48' | 60 | 2 | 1200 | 'EWS Consulting' | 'Future Energy GmbH' | 'WEB Windenergie AG' | 1998 | 'Production' | '' | 'Link' | 20-Feb-0020 | 'Micon' | 600 | 48 |
---|
7 | 1249 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Schernham' | 'Schernham' | 'NA' | 48.1790 | 13.6090 | 'NA' | 'Yes' | 'No' | 'Enercon' | 'E66/1800' | 86 | 1 | 1800 | 'Windkraft Innviertel GmbH' | 'Windkraft Innviertel GmbH' | 'NA' | NaN | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Enercon' | 1800 | 70 |
---|
8 | 1257 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Spörbichl' | 'Spörbichl' | 'NA' | 48.5520 | 14.6000 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V47/660' | 65 | 2 | 1320 | 'EWS Consulting' | 'New Energy/Austrian Wind Power GmbH' | 'NA' | 1999 | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Vestas' | 660 | 47 |
---|
9 | 1248 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Steiglberg' | 'Steiglberg' | 'NA' | 48.0960 | 13.3560 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V80/2000' | 100 | 1 | 2000 | 'EWS Consulting' | 'NA' | 'Windkraft Simonsfeld GmbH & Co KG' | 2002 | 'Production' | '' | 'Link' | 16-Sep-0019 | 'Vestas' | 2000 | 80 |
---|
10 | 1250 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Steindlberg' | 'Steindlberg' | 'NA' | 48.3220 | 13.6660 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V47/660' | 65 | 2 | 1320 | 'EWS Consulting' | 'Energy from A to Z Gmbh & Co KGa' | 'NA' | 2001 | 'Production' | '' | 'Link' | 29-Apr-0019 | 'Vestas' | 660 | 47 |
---|
11 | 1253 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Vorderweissenbach' | 'Sternwald I' | 'Sternwind' | 48.5790 | 14.2310 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V80/2000' | 100 | 1 | 2000 | 'Sternwind/ImWind' | 'Sternwind/WEB Windenergie AG' | 'Sternwind/WEB Windenergie AG' | NaN | 'Production' | '' | 'Link' | 20-Feb-0020 | 'Vestas' | 2000 | 80 |
---|
12 | 10444 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Vorderweissenbach' | 'Sternwald II' | 'Sternwind' | 48.5790 | 14.2310 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V90/2000' | 105 | 6 | 12000 | 'Sternwind/EWS Consulting/ImWind' | 'Sternwind/WEB Windenergie AG' | 'Sternwind/WEB Windenergie AG' | NaN | 'Production' | '' | 'Link' | 20-Feb-0020 | 'Vestas' | 2000 | 90 |
---|
13 | 22495 | 'Europe' | 'AT' | 'Austria' | 'NA' | 'Oberösterreich' | 'Vorderweissenbach' | 'Sternwald III' | 'NA' | 48.5840 | 14.2200 | 'NA' | 'Yes' | 'No' | 'Vestas' | 'V112/3000' | NaN | 2 | 6000 | 'WEB Windenergie AG' | 'Sternwind/WEB Windenergie AG' | 'Sternwind/WEB Windenergie AG' | 2016 | 'Production' | '' | 'Link' | 20-Feb-0020 | 'Vestas' | 3000 | 112 |
---|
14 | 23831 | 'Europe' | 'BE' | 'Belgium' | 'NA' | 'Antwerpen (Vlaanderen)' | 'Antwerpen' | 'Antwerpen BASF' | 'Zandvliet BASF' | 51.3630 | 4.2970 | 'NA' | 'Yes' | 'No' | 'Enercon' | 'E82/2000' | 98 | 6 | 12000 | 'Electrabel' | 'Engie' | 'Engie' | NaN | 'Production' | '' | 'Link' | 23-Mar-0020 | 'Enercon' | 2000 | 82 |
---|
⋮ |
---|
Load Power Curve data
Power curve data provide the relationship to convert windspeed into power production. This data is downloaded from ...
filename = 'Power_curves_20210319.xls';
opts = detectImportOptions(['WT_data/' filename],'Sheet','Power_curves');
tp=readtable(['WT_data/' filename],opts);
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
powerCurve.ws = table2array(tp(1,6:end-2));
powerCurve.ManufucturerName = tp.ManufucturerName(2:end);
powerCurve.TurbineName = tp.TurbineName(2:end);
powerCurve.Power = table2array(tp(2:end,6:end-2));
Smoothing Power-curve
Because windspeed is more heterogenous (in time) than the reanalysis data, it is standard procedure to smooth the powercurve with a Gaussian of mean 0 and standard deviation proportionaly to the windspeed. Here are some equation used in the litterature
- (Jourdier, 2020 ; 10.5194/asr-17-63-2020): 30 min
- (Staffell & Pfenninger 2016 ; 10.1016/j.energy.2016.08.068) : 1hr MERRA
- (Olauson & Bergkvist, 2015) 1hr MERRA
- (Olauson, 2018)
As our wind databse has a 1hour resolution, we follow Staffell & Pfenninger (2016)
powerCurve.ws_smooth=powerCurve.ws(1):0.1:powerCurve.ws(end);
powerCurve.Power_smooth = nan(size(powerCurve.Power,1),numel(powerCurve.ws_smooth));
for i_p=1:size(powerCurve.Power,1)
p = interp1(powerCurve.ws,powerCurve.Power(i_p,:),powerCurve.ws_smooth);
% figure; plot(powerCurve.ws,powerCurve.Power(i_p,:),'or',powerCurve.ws_smooth,p,'-k')
for i_w=1:numel(powerCurve.ws_smooth)
s = 0.6+0.2*powerCurve.ws_smooth(i_w);
weight = normpdf(powerCurve.ws_smooth,powerCurve.ws_smooth(i_w),s);
weight = weight ./sum(weight);
powerCurve.Power_smooth(i_p,i_w)=weight*p';
% figure; hold on; plot(powerCurve.ws,powerCurve.Power(i_p,:)); plot(powerCurve.ws_smooth,powerCurve.Power_smooth(i_p,:));
Add Powercurve to windturbine
We assign the power curve to each windfarm
[~,Locb] = ismember(string([t.Turbine t.Manufacturer]) , string([powerCurve.TurbineName powerCurve.ManufucturerName]),'rows');
t.powerCurve = nan(size(t,1),numel(powerCurve.ws_smooth));
t.powerCurve(Locb~=0,:) = powerCurve.Power_smooth(Locb(Locb~=0),:);
It would be nicer to do use the join function, but thes function requires that all windfarms have a matching powercurve. Hence, we use ismemeber()
%t2=join(t,tp,'LeftKeys','ID','RightKeys','Turb_ID');
Analysis of cut-in and cut-off
Compute the cut-in and cut-off value for each powercurve
Cutin = powerCurve.ws(sum(cumprod(powerCurve.Power==0,2),2));
Cutoff = powerCurve.ws(length(powerCurve.ws)-sum(cumprod(fliplr(powerCurve.Power)==0,2),2));
To plot the histogram of cut-in and cut-off, we need to accounts for each windfarm size (number of windturbines).
Cutin_h = repelem(Cutin(Locb(Locb~=0)),t.Number_of_turbines(Locb~=0));
Cutoff_h = repelem(Cutoff(Locb(Locb~=0)),t.Number_of_turbines(Locb~=0));
figure('position',[0 0 1000 300]);
histogram(Cutin_h); xlabel('windspeed'); ylabel('Number of windturbine'); title('cut-in'); legend(['M=' num2str(mean(Cutin_h))])
histogram(Cutoff_h); xlabel('windspeed'); title('cut-off'); legend(['M=' num2str(mean(Cutoff_h))])
%Cutin(Locb(Locb~=0)).*t.Number_of_turbines(Locb~=0).*t.turbine_sweptArea(Locb~=0))
Data Imputation
Several method exist for missing data: median, GLM or kNN (or more sofisticated like MICE).
Illustration of available data
var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power','powerCurve'};
figure('position',[0 0 1000 1000]);
subplot(6,1,1); histogram(t.Number_of_turbines); xlabel('Number of turbines'); ylim([0.5 10000]);set(gca, 'YScale', 'log')
subplot(6,1,2); histogram(t.turbine_sweptArea); xlabel('Swept Area'); ylim([0.5 10000]); set(gca, 'YScale', 'log')
subplot(6,1,3); histogram(t.Hub_height); xlabel('Hub height'); axis tight;set(gca, 'YScale', 'log')
subplot(6,1,4); histogram(t.turbine_capacity); xlabel('Turbine Capacity'); axis tight;set(gca, 'YScale', 'log')
subplot(6,1,[5 6]); hold on;
plot(powerCurve.ws_smooth, nanmean(t.powerCurve/1000),'k');
plot(powerCurve.ws_smooth, nanmedian(t.powerCurve/1000),'-.k');
plot(powerCurve.ws_smooth, quantile(t.powerCurve/1000,0.1),'--k');
plot(powerCurve.ws_smooth, quantile(t.powerCurve/1000,.9),'--k');
ax=gca; ylabel('Power MW'); xlabel('Windspeed')
var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power','powerCurve'};
a=sprintf([num2str(size(t,1)) '\t windfarms\n' ]);
a=[a sprintf([num2str(sum(all(isnan(t.(var_test{i})),2))) '\t windfarms without ' var_test{i} '\n' ])];
disp(a)
12518 windfarms
166 windfarms without turbine_sweptArea
168 windfarms without turbine_capacity
4351 windfarms without Hub_height
154 windfarms without Number_of_turbines
15 windfarms without Total_power
3259 windfarms without powerCurve
Old Illustration
% var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power'};
% figure('position',[0 0 1000 1000]);
% for i1=1:numel(var_test)
% for i2=(i1+1):numel(var_test)
% subplot(numel(var_test),numel(var_test),i2+(i1-1)*numel(var_test)); hold on
% plot(t.(var_test{i2}),t.(var_test{i1}),'.k');
% if i2==i1+1, xlabel(strrep(var_test{i2},'_',' ')); ylabel(strrep(var_test{i1},'_',' ')); end
Create new variable for imputated value
Windfarm level: Number_of_turbines Turbine_capacity and Total_power
First, we deal with value at the windfarm level. Three variables are linked, with total power = number_of_turbine x turbine_capacity.
Check occurane of nan with either/or these two variable.
X=[tim.Number_of_turbines tim.Total_power tim.turbine_capacity];
[a1,~,c] = unique(isnan(X),'rows');
table(~a1(:,1), ~a1(:,2), ~a1(:,3) ,histcounts(c)','variableNames',{'Number of turbine','Total power','Turbine capacity','Number'})
ans = 4×4 table
| Number of turbine | Total power | Turbine capacity | Number |
---|
1 | 1 | 1 | 1 | 12350 |
---|
2 | 1 | 0 | 0 | 14 |
---|
3 | 0 | 1 | 0 | 153 |
---|
4 | 0 | 0 | 0 | 1 |
---|
For all the missing windfarm, we missing two variables, so we can't fill them up easily.
We first fill-up Number_of_turbines and Total_power at the same time.We perform the prediction for both variable with a fglm
mdl = fitglm(tim.Number_of_turbines, tim.Total_power);
mdl2 = fitglm(tim.Total_power,tim.Number_of_turbines);
[ypred,yci] = predict(mdl,tim.Number_of_turbines(isnan(tim.Total_power),:));
tim.Total_power(isnan(tim.Total_power)) = ypred;
[ypred,yci] = predict(mdl2,tim.Total_power(isnan(tim.Number_of_turbines),:));
tim.Number_of_turbines(isnan(tim.Number_of_turbines)) = round(ypred);
Ilustration
figure('position',[0 0 500 300]); hold on; box on;
plot(t.Total_power,t.Number_of_turbines,'.k'); l=lsline; l.Color='r';
plot(tim.Total_power(isnan(t.Total_power)|isnan(t.Number_of_turbines)),tim.Number_of_turbines(isnan(t.Total_power)|isnan(t.Number_of_turbines)),'.r');
xlabel('Total_power'); ylabel('Number_of_turbines');
Then, we fill-up turbine capacity
Wind turbine capacity is directly related to total power and number of windturbine
tim.turbine_capacity(isnan(tim.turbine_capacity)) = tim.Total_power(isnan(tim.turbine_capacity)) ./ tim.Number_of_turbines(isnan(tim.turbine_capacity));
Illustration
plot(t.Total_power ./ t.Number_of_turbines , t.turbine_capacity , '.k' ); l=lsline; l.Color='r';
plot(tim.Total_power(isnan(t.turbine_capacity)) ./ tim.Number_of_turbines(isnan(t.turbine_capacity)) , tim.turbine_capacity(isnan(t.turbine_capacity)) , '.r' );
xlabel('Total_power / Number_of_turbines'); ylabel('turbine_capacity');
Windturbine level: Hub_height and turbine_capacity
At the windturbine level, we are missing a lot of hub height. Hub height is well related to turbine capacity and swept area.
Check occurane of nan for the three variable
X=[tim.turbine_sweptArea tim.turbine_capacity tim.Hub_height];
[a1,~,c] = unique(isnan(X),'rows');
table(~a1(:,1), ~a1(:,2), ~a1(:,3) ,histcounts(c)','variableNames',{'Swept area','Turbine capacity','hub height','Number'})
ans = 4×4 table
| Swept area | Turbine capacity | hub height | Number |
---|
1 | 1 | 1 | 1 | 8167 |
---|
2 | 1 | 1 | 0 | 4185 |
---|
3 | 0 | 1 | 0 | 165 |
---|
4 | 0 | 0 | 0 | 1 |
---|
Hub height can be determined from swept area and/or turbine capacity for 4K cases.
First, we build a glm with turbine_capacity and turbine_sweptArea and predict only for nan value in Hub_height:
mdl = fitglm([tim.turbine_sweptArea tim.turbine_capacity],tim.Hub_height);
[ypred,yci] = predict(mdl,[tim.turbine_sweptArea(isnan(tim.Hub_height),:) tim.turbine_capacity(isnan(tim.Hub_height),:)]);
ypred(ypred>max(tim.Hub_height))=max(tim.Hub_height); % Avoid missleading value of hubheight
tim.Hub_height(isnan(tim.Hub_height)) = ypred;
Then, we build a glm with turbine_capacity and predict only for nan value in Hub_height:
mdl = fitglm(tim.turbine_capacity,tim.Hub_height);
[ypred,yci] = predict(mdl,tim.turbine_capacity(isnan(tim.Hub_height),:));
% ypred(ypred>max(tim.Hub_height))=max(tim.Hub_height); % Avoid missleading value of hubheight
tim.Hub_height(isnan(tim.Hub_height)) = ypred;
Finally, we build a glm with turbine_capacity and predict only for nan value in turbine_sweptArea:
mdl = fitglm(tim.turbine_capacity,tim.turbine_sweptArea);
[ypred,yci] = predict(mdl,tim.turbine_capacity(isnan(tim.turbine_sweptArea),:));
% ypred(ypred>max(tim.Hub_height))=max(tim.Hub_height); % Avoid missleading value of hubheight
tim.turbine_sweptArea(isnan(tim.turbine_sweptArea)) = ypred;
Ilustration
figure('position',[0 0 1000 300]);
plot(t.turbine_sweptArea,t.Hub_height,'.k'); l=lsline; l.Color='r';
plot(tim.turbine_sweptArea(isnan(t.Hub_height)),tim.Hub_height(isnan(t.Hub_height)),'.r');
xlabel('turbine_sweptArea'); ylabel('Hub_height');
plot(t.turbine_capacity,t.Hub_height,'.k'); l=lsline; l.Color='r';
plot(tim.turbine_capacity(isnan(t.Hub_height)),tim.Hub_height(isnan(t.Hub_height)),'.r');
xlabel('turbine_capacity'); ylabel('Hub_height');
We can then assess the missing value in the new imputated table
var_test = {'turbine_sweptArea','turbine_capacity','Hub_height','Number_of_turbines','Total_power'};
a=sprintf([num2str(size(tim,1)) '\t windfarms\n' ]);
a=[a sprintf([num2str(sum(all(isnan(tim.(var_test{i})),2))) '\t windfarms without ' var_test{i} '\n' ])];
disp(a)
12518 windfarms
1 windfarms without turbine_sweptArea
1 windfarms without turbine_capacity
1 windfarms without Hub_height
1 windfarms without Number_of_turbines
1 windfarms without Total_power
The remaining missing data (if any) can be filled with the median value.
tim.(var_test{i})(isnan(tim.(var_test{i})))=nanmedian(tim.(var_test{i}));
Power Curve
To input the power curve, we parametrize the power curve function based on its max value which corresponds to the windturbine capacity.
We first build a power curve template based on the median value of all windfarm (note that we use tim here)
powerCurve_template = nanmedian(tim.powerCurve'./max(tim.powerCurve,[],2)',2);
figure('position',[0 0 900 300]); hold on
plot(powerCurve.ws_smooth,(powerCurve.Power_smooth'./max(powerCurve.Power_smooth,[],2)'),'color',[.8 .8 .8])
plot(powerCurve.ws_smooth,powerCurve_template,'k','linewidth',2)
xlabel('windspeed [m/s]'); ylabel('Power'); title('Power curve normalized by its max value')
The maximum value of the powercurve is well related to the turbine capacity
Use GLM to impute max powercurve based on turbine capacity
mdl = fitglm(tim.turbine_capacity,max(tim.powerCurve,[],2) );
[ypred,yci] = predict(mdl,tim.turbine_capacity(isnan(max(tim.powerCurve,[],2)),:));
% ypred(ypred>max(tim.powerCurve(:)))=max(tim.powerCurve(:));
tim.powerCurve(isnan(max(tim.powerCurve,[],2)),:) = powerCurve_template' .* ypred;
plot(max(t.powerCurve,[],2),t.turbine_capacity,'.k');l=lsline; l.Color='r';
plot(max(tim.powerCurve(isnan(max(t.powerCurve,[],2)),:),[],2),t.turbine_capacity(isnan(max(t.powerCurve,[],2))),'.r');
xlabel('Max Power Curve'); ylabel('Turbine Capacity')
Windfarm database characteristics
disp(['Number of Windfarms: ' num2str(height(tim))])
Number of Windfarms: 12518
disp(['Number of Windturbines: ' num2str(nansum(tim.Number_of_turbines))])
Number of Windturbines: 42696
disp(['Total power: ' num2str(nansum(tim.Total_power*1000/1e9))])
Group by country
tim.Total_sweptArea = tim.turbine_sweptArea.*tim.Number_of_turbines;
groupsummary(tim,'Country','sum',{'Number_of_turbines' 'Total_power','Total_sweptArea'})
ans = 11×5 table
| Country | GroupCount | sum_Number_of_turbines | sum_Total_power | sum_Total_sweptArea |
---|
1 | 'Austria' | 13 | 31 | 47920 | 1.4496e+05 |
---|
2 | 'Belgium' | 260 | 811 | 1839050 | 5.2464e+06 |
---|
3 | 'Czech Republic' | 45 | 124 | 222890 | 6.5768e+05 |
---|
4 | 'Denmark' | 310 | 495 | 383840 | 9.3967e+05 |
---|
5 | 'France' | 1421 | 7614 | 1.6036e+07 | 4.7636e+07 |
---|
6 | 'Germany' | 9703 | 30472 | 5.3427e+07 | 1.5217e+08 |
---|
7 | 'Luxembourg' | 26 | 74 | 153500 | 4.4892e+05 |
---|
8 | 'Netherlands' | 624 | 1755 | 3157710 | 8.3218e+06 |
---|
9 | 'Poland' | 50 | 509 | 1106855 | 3.6533e+06 |
---|
10 | 'Spain' | 47 | 774 | 639410 | 1.7896e+06 |
---|
11 | 'Switzerland' | 19 | 37 | 75050 | 2.0912e+05 |
---|
*GroupCount=number of windfarm
Distance to cast
tmp = pdist2([tim.Latitude tim.Longitude],[coastlat coastlon], @lldistkm);
tim.distCoast = min(tmp,[],2);
hh = repelem(tim.Hub_height,tim.Number_of_turbines);
figure('position',[0 0 800 400]);
histogram(hh); ylabel('Number of Windturbines'); xlabel('Hub Height [m]');
legend(['M=' num2str(mean(hh)) ' ; SD=' num2str(std(hh)) ])
rr = repelem(tim.turbine_rotorRadius,tim.Number_of_turbines);
hhhh = repelem(tim.Hub_height,tim.Number_of_turbines);
tmp = real(2*sqrt(rr.^2 - (h-hhhh).^2));
tmp = tmp ./ sum(tmp,2) .* rr.^2*pi;
figure('position',[0 0 800 400]);
subplot(1,2,1); barh(h,nansum(tmp))
ylabel('Height above ground level'); xlabel('Sum of area [m]');
subplot(1,2,2); plot(h,cumsum(nansum(tmp))./sum(tmp(:),'omitnan'))
xlabel('Height above ground level'); grid on; axis tight; xline([60 150])
dd = repelem(sqrt(tim.turbine_sweptArea/pi)*2,tim.Number_of_turbines);
figure('position',[0 0 800 400]);
histogram(dd); ylabel('Number of Windturbines'); xlabel('Swept Diameter [m]');
legend(['M=' num2str(mean(dd)) ' ; SD=' num2str(std(dd)) ])
Save
save('data/windfarms_processed.mat', 'tim')