How satellite data (ERA5) can support renewables deployment?
By: Basile Goussard
Tags: Renewable Energy, Satellite, Geospatial, Data Science, Climate Change

0°) Toolbox & Data

I used a jupyter notebook with a conda virtual environment design for geodata science with the following libraries : numpy (basic array management librarie) [link], xarray (used to manage netCDF data (Satellite data)) [link], pandas (used to manage data) [link], geopandas (used to manage geospatial data) [link], KeplerGl (used to visualized geospatial data) [link]

ERA5 Data

Let’s start by exploring the data. I used the Climate Change Service data store to retrieve wind velocity at 100 meters from ERA5. ERA5 is a dataset that provides more than 100 atmospheric variables.

ERA5 is built on top of various satellite data(more than 30 satellites) and in-situ data. The challenge is to combine all this data to retrieve physical parameters (like the wind speed or the temperature). This is possible thanks to some advanced modeling and data assimilation. (more info here)

I have downloaded the wind speed at 100 meters above the surface for one year. But why this data? Because :

wind turbine energy is made from wind speed

wind turbine height is around 100 meters

I°) Calculate the wind speed in France in 2019

Here we have to be careful about how we manage the data. Indeed the input data weight is around 2Gb. So keep in mind that the barbaric way of coding could crash your kernel. It happened a lot in my case :(…

The first step is to keep only the wind data in France. To do so you have to find the indexes which correspond to the latitude and longitude of your region of interest (or directly download your region of interest thanks to the ERA5 api) [link here] in the xarray file. Now we can transform the data as a dataframe by using (xarray.to_dataframe(name = ‘value’)). Here you will have a weird dataframe, to retrieve the dataframe format that we all know just use the function (.reset_index()).

#Preprocessing ERA5 data (netCDF format) import xarray

ds = xr.open_dataset('./data/dataset.nc') windU = ds.to_array(dim = 'u100') # (2, 365, 721, 1440) | 1Gb

windV = ds.to_array(dim = 'v100') # (2, 365, 721, 1440) | 1Gb Fr_windU = windU[0,:,156:200,0:40].to_dataframe(name = 'value')

Fr_windV = windV[0,:,156:200,0:40].to_dataframe(name = 'value') Fr_windU = Fr_windU.reset_index()

Fr_windV = Fr_windV.reset_index()

Now the ERA5 data has the same structure as a typical dataframe.

Eastward wind speed

Eastward wind speed data description above France

By applying all this preprocessing we retrieve Eastward wind in a dataframe (Fr_WindU) and Northward wind in another dataframe (Fr_WindV). Let’s calculate the norm of the wind speed each day by applying wind speed= sqrt(u² + v²)

Fr_Wind['norm'] = np.sqrt(Fr_WindU['value']**2+Fr_WindV['value']**2)

Let’s start by describing the data :

Here we have around 1 million rows. We can see that the average wind in France was 5.44 m/s and the maximum wind was 36.19 m/s ! (2019) Here I don’t spend much time on the data description but it could be very interesting to dive in a statistical study of the wind in France during 2019 in the future.

II°) Calculate the wind power each day in France

We want to retrieve the wind power in each location in France each day for one year! So let’s go!

Let’s suppose that our wind turbine has a wing of r meter, that the air has a volumic mass of ρ and the velocity of the wind is v :

Power available = 0.5 ρ π r² v³

wind power available from wind velocity

By applying these formulas we can retrieve the power available for a wind turbine each day in each location in France during 2019.

III°) Calculate the power production of a wind turbine each day in France

a°) Wind turbine model (simplified) :

I supposed here that a wind turbine has three modes depending on the wind (off, nominal and saturated) as described in the following graph (in short a wind turbine doesn’t work if there is almost no wind or too much wind (mode off) moreover there is a nominal mode if the wind is in the good range)

Mode off (Available wind speed is set to 0 m/s)

a) The wind is below the minimal wind velocity (vWind < vmin = 2 m/s)

b) The wind is above the maximal wind velocity(vWind > vmax=25 m/s)

Mode saturated (Available wind speed is set to 15 m/s.)

It happens if the wind velocity is above 15 m/s and below vmax. (vmax > vWind > vsat = 15m/s)

Mode nominal (Available wind speed is the wind speed)

It happens if the wind velocity is above vmin and below vsat. (vsat > vWind > vmin)

b°) Wind turbine efficiency (simplified) :

I decided to apply a power efficiency factor of μ = 0.35 (to produce 1 Watt you need 2.857 Watt)

c°) Power produced by a wind turbine (simplified) :

Now we can combine the wind turbine model, the power of the wind, and the wind turbine efficiency to calculate the power production.

Power produce = μ x Power of the wind(WindTurbineMode)

We now have the power production from a basic wind turbine every day at each site in France in 2019.

IV°) Calculate the energy production of a wind turbine in France

We need the energy produce by a wind turbine for one year to know where we should put our future wind turbine.

Energy produce = ∑ Power produce dt

The energy produce during one year for one wind turbine is now available in our dataframe. To be more concrete let’s divide this energy by the energy consumption of one french inhabitant during one year (6940 kWh / an). We obtain the map below.