Group project: the Climate System¶
Instructions¶
Objectives
In this final project, you will apply the methods you learned over the past weeks to answer the questions below.
Deadline
Please submit your project via OLAT before Thursday January 12 at 00H (in the night from Wednesday to Thursday).
Formal requirements
You will work in groups of two. If we are an odd number of students, one group can have three participants. (Tip: I recommend that students who have not followed my programming class to team up with students who have).
Each group will submit one (executed) jupyter notebook containing the code, plots, and answers to the questions (text in the markdown format). Please also submit an HTML version of the notebook. Each group member must contribute to the notebook. The notebook should be self-contained and the answers must be well structured. The plots must be as understandable as possible (title, units, x and y axis labels, appropriate colors and levels…).
Please be concise in your answer. I expect a few sentences per answer at most - there is no need to write a new text book in this project! Use links and references to the literature or your class slides where appropriate.
Grading
I will give one grade per project, according to the following table (total 10 points):
- correctness of the code and the plots: content, legends, colors, units, etc. (3 points)
- quality of the answers: correctness, preciseness, appropriate use of links and references to literature or external resources (5 points)
- originality and quality of the open research question (2 points)
1 2 3 4 5 6 7 8 9 | # Import the tools we are going to need today: import matplotlib.pyplot as plt # plotting library import numpy as np # numerical library import xarray as xr # netCDF library import pandas as pd # tabular library import cartopy # Map projections libary import cartopy.crs as ccrs # Projections list # Some defaults: plt.rcParams['figure.figsize'] = (12, 5) # Default plot size |
Part 1 - temperature climatology¶
Open the ERA5 temperature data:
1 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_t2m.nc') |
1 2 | dstempmean = ds.t2m.mean(dim='time') #Mean Temperature in Kelvin dstempdegre = (dstempmean - 273.15) #Mean Temperature in Celsius |
Plot three global maps:
- Compute and plot the temporal mean temperature $\overline{T}$ for the entire period (unit °C)
- Compute and plot $\overline{T^{*}}$ (see lesson), the zonal anomaly map of average temperature.
- Compute and plot the monthly average temperature for each month $\overline{T_M}$ (annual cycle). I expect a variable of dimensions (month: 12, latitude: 241, longitude: 480). Hint: remember the
.groupby()
command we learned in the lesson. Now plot the average monthly temperature range, i.e. $\overline{T_M}max$ - $\overline{T_M}min$ on a map.
Questions:
- Look at the zonal temperature anomaly map.
- Explain why norther Europe and the North Atlantic region is significantly warmer than the same latitudes in North America or Russia.
- Explain why the Northern Pacific Ocean does not have a similar pattern.
- Look at the average monthly temperature range map.
- Explain why the temperature range is smaller in the tropics than at higher latitudes
- Explain why the temperature range is smaller over oceans than over land
- Where is the temperature range largest? Explain why.
- Compute and plot the temporal mean temperature $\overline{T}$ for the entire period (unit °C)
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) dstempdegre.plot( ax = ax, transform=ccrs.PlateCarree()) ax.coastlines();ax.gridlines(); plt.title('Map of temporal mean temperature from 1979-2018 in degrees') plt.show() |
- Compute and plot $\overline{T^{*}}$ (see lesson), the zonal anomaly map of average temperature.
1 2 3 4 5 6 | b = dstempdegre.mean(dim = 'latitude') ax = plt.axes(projection=ccrs.Robinson()) (dstempdegre - b).plot.imshow(ax=ax, transform=ccrs.PlateCarree()) ax.coastlines(); ax.gridlines(); plt.title('Map of zonal anomaly of average temperature from 1979-2018 in degrees') plt.show() |
- Compute and plot the monthly average temperature for each month $\overline{T_M}$ (annual cycle). I expect a variable of dimensions (month: 12, latitude: 241, longitude: 480). Hint: remember the
.groupby()
command we learned in the lesson. Now plot the average monthly temperature range, i.e. $\overline{T_M}max$ - $\overline{T_M}min$ on a map.
1 | monavgtemp = ds.t2m.groupby('time.month').mean(dim = 'time') |
1 2 3 | maxmonavg = monavgtemp.max(dim = 'month') minmonavg = monavgtemp.min(dim = 'month') diffavg = (maxmonavg - minmonavg) |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) diffavg.plot(ax=ax, transform=ccrs.PlateCarree()) ax.coastlines(); ax.gridlines(); plt.title('Map of average monthly temperature range from 1979-2018 in degrees') plt.show() |
Part 1 Questions
North Atlantic and norther Europe is significantly warmer than the same latitudes in North America or Russia because of the Gulf stream. The Gulf stream is a warm and swift current that starts from Mexico and moves to northwest Europe and to the north Atlantic. The northern pacific Ocean does not have a similiar pattern because the pacific ocean is much bigger and it has a circular current.
The temperature range is smaller in the tropics, because all year the tropics recieve more or less the same radiation from the sun. At higher latitudes the inclination of the earth makes a bigger difference. In winter the radiation that comes from the sun hits the Earth in a very flat angle and so the radiation is spread over a wider area of the earth, but in summer it's the other way round.
Water heats and cools more slowly, then the Landsurface. This is because land has a smaller heatcapacity than water. Therefore is the temperature range smaller over oceans than over land.
In Siberia the temperature range is the largest. In winter it's the coldest place in the northern hemisphere and in the summer it can be quit warm. Therefore the temperature range is so big. The reason is because Siberia has a big distance from water. Water has a moderating influence because it has such a high heat capacity. Thus, being in the middle of a continent allows for large temperature swings from one season (and even day) to another. This only occurs in the middle and relatively high latitudes where a wide variety of air masses are possible.
Part 2 - Precipitation climatology¶
Open the precipitation file and explore it. The units of monthly precipitation are wrongly labeled (unfortunately). They should read: m per day.
1 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_tp.nc') |
Using .groupby()
, compute the average daily precipitation for each month of the year (I expect a variable of dimensions (month: 12, latitude: 241, longitude: 480)). Convert the units to mm per day. Plot a map of average daily precipitation in January and in August with the levels [0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40]
and the colormap `YlGnBu'
Questions:
- Describe the location of the ITCZ in January and February. Without going into the details, explain (in one or two sentences)
- Describe the precipitation seasonality in West Africa and in India. Name the phenomenon at play.
1 2 | da = (ds.tp * 1000) dayrain = da.groupby('time.month').mean(dim ='time') |
1 2 | janrain = dayrain.loc[dayrain['month'] == 1] augrain = dayrain.loc[dayrain['month'] == 8] |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) janrain.plot(ax=ax, transform=ccrs.PlateCarree(),cmap='YlGnBu', levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40]) ax.coastlines(); ax.gridlines(); plt.title('Map of average daily percipitation in January (Unit: (mm/day))') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) augrain.plot(ax=ax, transform=ccrs.PlateCarree(),cmap='YlGnBu', levels=[0.5, 1, 2, 3, 4, 5, 7, 10, 15, 20, 40]) ax.coastlines(); ax.gridlines(); plt.title('Map of average daily(mm/day) percipitation in August (Unit: (mm/day))') plt.show() |
Part 2 Questions
The Intertropical Convergence Zone (ITCZ), is a band of low pressure around the Earth which generally lies near to the equator. In January and February the ITCZ lies about at 15°S over South America and Africa. Over the ocean the ITCZ is less mobile, where it holds a stationary position just north of the equator.
West Africa: The key features of the West African Monsoon are the low level southwesterly flow from the Atlantic Ocean and the Inter-Tropical Convergence Zone (ITCZ) north of the equator. Monsoon rainfall over West Africa occur during the June through September period.
India: Indian monsoon, the most prominent of the world’s monsoon systems, which primarily affects India and its surrounding water bodies. It blows from the northeast during cooler months and reverses direction to blow from the southwest during the warmest months of the year. This process brings large amounts of rainfall to the region during June and July.
https://www.clivar.org/african-monsoon https://www.britannica.com/science/West-African-monsoon https://www.britannica.com/science/Indian-monsoon
Part 3: sea-level pressure and surface winds¶
Open the file containing the surface winds (u10
and v10
) and sea-level pressure (msl
).
1 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_uvslp.nc') |
Compute $\left[ \overline{SLP} \right]$ (the temporal and zonal average of sea-level pressure). Convert it to hPa, and plot it (line plot). With the help of plt.axhline, add the standard atmosphere pressure line to the plot to emphasize high and low pressure regions. Repeat with $\left[ \overline{u_{10}} \right]$ and $\left[ \overline{v_{10}} \right]$ (in m s$^{-1}$) and add the 0 horizontal line to the plot (to detect surface westerlies from easterlies for example).
Questions:
- Based on your knowledge about the general circulation of the atmosphere, explain the latitude location of the climatological high and low pressure systems of Earth.
- Similarly, explain the direction and strength of the zonal and meridional winds on earth (tip: the sea-level pressure plot helps)
1 2 | ds = ds.drop(labels=list(set(ds.data_vars) - set(['msl']))) dt = (ds.mean(dim=['time', 'longitude'])/100) |
1 2 3 4 5 6 7 8 9 10 11 | plt.plot() x = dt.latitude y = dt.msl plt.plot(x, y, label='temporal and zonal average of sea-level pressure') plt.xlim(-90, 90) plt.xlabel('latitude') plt.ylabel('mean seelevel pressure, in hPa') plt.axhline(1013.25, color='r', linestyle='--', label= 'standard atmosphere pressure') plt.title('Graph of temporal and zonal average of sea-level pressure') plt.legend() plt.show() |
1 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_uvslp.nc') |
1 2 | ds = ds.drop(labels=list(set(ds.data_vars) - set(['u10']))) dt = (ds.mean(dim=['time', 'longitude'])) |
1 2 3 4 5 6 7 8 9 10 11 | plt.plot() x = dt.latitude y = dt.u10 plt.plot(x,y, label = 'temporal and zonal average of the u10') plt.xlabel('latitude') plt.ylabel('10 metre U wind component in m/s') plt.axhline(0, color='r', linestyle='--', label= '0 horizontal line') plt.xlim(-90, 90) plt.title('Graph of temporal and zonal average of U10') plt.legend() plt.show() |
1 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_uvslp.nc') |
1 2 | ds = ds.drop(labels=list(set(ds.data_vars) - set(['v10']))) dt = (ds.mean(dim=['time', 'longitude'])) |
1 2 3 4 5 6 7 8 9 10 11 | plt.plot() x = dt.latitude y = dt.v10 plt.plot(x,y, label = 'temporal and zonal average of the v10') plt.xlabel('latitude') plt.ylabel('10 metre V wind component in m/s') plt.axhline(0, color='r', linestyle='--', label= '0 horizontal line') plt.xlim(-90, 90) plt.title('Graph of temporal and zonal average of V10') plt.legend() plt.show() |
Part 3 Questions
In the north pole and south pole we find the polar highs system. Between 40° and 55° latitude we find the middle-latitude cyclonic storms. Areas of high pressure systems are about 30°, called the subtropical highs. In the zone of the equator we find the ITCZ, where several low pressure system are located.
Zonal means "along a latitudinal circle" or in the west–east direction. Zonal flow is a meteorological term regarding atmospheric circulation following a general flow pattern along latitudinal lines.
Meridional means "along a longitudinal circle" (a.k.a. meridian) or in the north–south direction. Meridional flow is a general air flow pattern from north to south, or from south to north, along the Earth's longitude lines (perpendicular to a zonal flow). Extratropical cyclones in this environment tend to be stronger and move slower. This pattern is responsible for most instances of extreme weather, as not only are storms stronger in this type of flow regime, but temperatures can reach extremes as well, producing heat waves and cold waves depending on the equator-ward or poleward direction of the flow.
Part 4: temperature change and CO$_2$ concentrations¶
Download the global average CO$_2$ concentration timeseries data in the CSV format (source: NOAA). Here, let me help your read them using pandas:
1 | df = pd.read_csv('co2_mm_gl.csv', skiprows=55, parse_dates={'date' : [0, 1]}, index_col='date') |
Prepare three plots:
- plot the monthly global CO$_2$ concentration as a function of time.
- plot the annual average timeseries of global CO$_2$ concentration as a function of time.
- plot the annual average timeseries of global CO$_2$ concentration and of global 2m temperature from ERA5 on the same plot (using a secondary y axis for temperature).
Questions:
- Describe and explain the annual cycle of CO$_2$ concentrations
- What was the CO$_2$ concentration in the atmosphere in the pre-industrial era? Compute the annual increase in CO$_2$ concentration (unit: ppm per year) between 1980 and 1985 and between 2016 and 2021.
- Describe the relationship between global temperatures and CO$_2$ concentrations. Beside CO$_2$, name three processes that can influence temperature variability and change at the global scale.
1 2 3 4 5 6 7 8 9 | co2 = df.resample('M').mean() plt.plot() x = co2['average'] plt.plot(x, label = 'monthly global CO 2 concentration as a function of time') plt.xlabel('Time in Month') plt.ylabel('CO2 Concentration in ppm') plt.legend() plt.title('Graph of monthly global CO2 concentration from 1979-2022') plt.show() |
1 2 3 4 5 6 7 | co2year = df.resample('y').mean() plt.plot(co2year['average'], label = 'annual average timeseries of global CO 2 concentration') plt.xlabel('Time in Years') plt.ylabel('CO2 Concentration in ppm') plt.title('Graph of annual average timeseries of global CO2 from 1979-2022') plt.legend() plt.show() |
1 2 3 4 5 6 7 | temp = xr.open_dataset(r'ERA5_LowRes_Monthly_t2m.nc') dt = (temp.mean(dim=['longitude', 'latitude'])) dt = dt.resample(time='y').mean() co2year = df.resample('y').mean() co2average = co2year['average'] x = dt.t2m y = dt.time |
1 2 3 4 5 6 7 8 9 10 | ax1 = plt.subplot() ax2 = ax1.twinx() ax1.plot(co2average, label = 'co2 concentration') ax2.plot(y,x, color= 'r', label = 'Temperatur in K') ax1.set_ylabel("CO2 concentration in ppm") ax1.set_xlabel("Time in Years") ax2.set_ylabel("Temperature in 2 meters height") plt.title('annual average timeseries of global CO2 concentration from 1979-2022 and of global 2m temperature from 1979-2018') plt.legend() plt.show() |
Part 4 Question
The northern hemisphere has more land and also more trees (tundra) than the southern hemisphere. So the CO 2 concentration globaly will decreas during the summer in the north, because the plants absorb more CO 2 from the atmosphere than in winter.
The pre-industrial CO 2 concentration was 286ppm. The increase between 1980 and 1985 was from 339ppm to 346ppm. The increase between 2016 and 2021 was from 403ppm to 415ppm.
If every year the CO 2 concentration in the atmosphere will increase, the global temperature will rise.
A very big volcano erruption . The eruptions must inject over 100,000 tons of SO 2 into the stratosphere are considered to be large enough to affect the Earth's climate on a scale of more than 1 year. This is due to the optical properties of SO 2 and sulfate aerosols, which strongly absorb or scatter solar radiation, creating a global layer of sulfuric acid haze.
Another process that can influence temperature variability and change at the global scale is the the distance between earth and sun. These orbital changes modify the total amount of sunlight reaching the Earth by up to 25% at midlatitudes. This effect is called Milankovitch cycle.
Solar radiation can also influence temperature variability at global scale. Every 11 years the number of sunspots changes from a maximum number to a minimum number. The sun emits slightly more radiation during active periods of sunspots. While more sunspots may contribute to warmer global climate, less sunspots appear to be associated with a cooler global climate.
Part 5: variability and ENSO (open research question)¶
Using the available data, describe the global effect of an El Niño year and a La Niña year on sea-surface temperature, precipitation, and air temperature. I suggest to look for literature or a google search on strong ENSO events in the past 40 years, and select one good example for a positive and a negative phase. Then use annual or seasonal anomaly maps to show the patterns of SST, temperature and precipitation anomalies during these events. With citation or links, explain why you picked these years as examples.
El nino:
El Niño is characterized by unusually warm ocean temperatures in the Equatorial Pacific. It's an oscillation of the ocean-atmosphere system in the tropical Pacific having important consequences for weather around the globe. Among these consequences are increased rainfall across the southern tier of the US and in Peru, which has caused destructive flooding, and drought in the west Pacific, sometimes also associated with devastating bush fires in Australia. During 1997/98 the el nino effect was very strong. The ocean was 2.4°C warmer than usual
La nina: La Niña is characterized by unusually cold ocean temperatures central and eastern tropical Pacific ocean that impact global weather patterns. La Niña conditions recur every few years and can persist for as long as two years. La nina brings to the west coast of the US wet and cool weather. Over Mexico and Florida the weather is drier and warmer than usual. Australia and Indonesia are typically wetter than normal During 1999/2000 the la nina effect was very strong. The ocean was 1.6°C colder than normal.
https://www.pmel.noaa.gov/elnino/what-is-el-nino https://ggweather.com/enso/oni.htm https://education.nationalgeographic.org/resource/el-nino
1 2 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_t2m.nc') dstempmean = ds.t2m.mean(dim='time') |
1 2 3 4 5 | dsa = ds.t2m.groupby('time.year').mean(dim ='time') year97 = dsa.loc[dsa['year'] == 1997] year98 = dsa.loc[dsa['year'] == 1998] year99 = dsa.loc[dsa['year'] == 1999] year00 = dsa.loc[dsa['year'] == 2000] |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) year97.plot( ax = ax, transform=ccrs.PlateCarree()) ax.coastlines();ax.gridlines(); plt.title('Map of emporal mean temperature for 1997 in kelvin') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) year98.plot( ax = ax, transform=ccrs.PlateCarree()) ax.coastlines();ax.gridlines(); plt.title('Map of emporal mean temperature for 1998 in kelvin') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) year99.plot( ax = ax, transform=ccrs.PlateCarree()) ax.coastlines();ax.gridlines(); plt.title('Map of emporal mean temperature for 1999 in kelvin') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) year00.plot( ax = ax, transform=ccrs.PlateCarree()) ax.coastlines();ax.gridlines(); plt.title('Map of emporal mean temperature for 2000 in kelvin') plt.show() |
1 2 3 4 5 6 | meantempoverall = dstempmean.mean(dim = 'latitude') ax = plt.axes(projection=ccrs.Robinson()) (year97-meantempoverall).plot( ax = ax, transform=ccrs.PlateCarree(),cmap='YlGnBu') ax.coastlines();ax.gridlines(); plt.title('Map of anomaly temperature for 1997 in kelvin') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) (year98-meantempoverall).plot( ax = ax, transform=ccrs.PlateCarree(),cmap='YlGnBu') ax.coastlines();ax.gridlines(); plt.title('Map of anomaly temperature for 1998 in kelvin') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) (year99-meantempoverall).plot( ax = ax, transform=ccrs.PlateCarree(),cmap='YlGnBu') ax.coastlines();ax.gridlines(); plt.title('Map of anomaly temperature for 1999 in kelvin') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) (year00-meantempoverall).plot( ax = ax, transform=ccrs.PlateCarree(),cmap='YlGnBu') ax.coastlines();ax.gridlines(); plt.title('Map of anomaly temperature for 2000 in kelvin') plt.show() |
Wir haben es leider nicht hinbekommen zum einen die Daten von 1997 bis 1998 und 1999 bis 2000 in ein Dataarray zumergen, ausserdem ist bei den dadurch entstandenen anomalie Karten nahezu kein Unterscheid der einzelnen Jahre zuerkennen.
1 | ds = xr.open_dataset(r'ERA5_LowRes_Monthly_tp.nc') |
1 2 | da = (ds.tp * 1000) yearrain = da.groupby('time.year').sum(dim ='time') |
1 2 3 4 | rain97 = yearrain.loc[yearrain['year'] == 1997] rain98 = yearrain.loc[yearrain['year'] == 1998] rain99 = yearrain.loc[yearrain['year'] == 1999] rain00 = yearrain.loc[yearrain['year'] == 2000] |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) rain97.plot(ax=ax, transform=ccrs.PlateCarree(),cmap='YlGnBu', levels=[10, 15, 20, 40, 60, 80, 100, 200, 300, 400, 500, 650]) ax.coastlines(); ax.gridlines(); plt.title('Map of percipitation in 1997 in mm/year') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) rain98.plot(ax=ax, transform=ccrs.PlateCarree(),cmap='YlGnBu', levels=[10, 15, 20, 40, 60, 80, 100, 200, 300, 400, 500, 650]) ax.coastlines(); ax.gridlines(); plt.title('Map of percipitation in 1998 in mm/year') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) rain99.plot(ax=ax, transform=ccrs.PlateCarree(),cmap='YlGnBu', levels=[10, 15, 20, 40, 60, 80, 100, 200, 300, 400, 500, 650]) ax.coastlines(); ax.gridlines(); plt.title('Map of percipitation in 1999 in mm/year') plt.show() |
1 2 3 4 5 | ax = plt.axes(projection=ccrs.Robinson()) rain00.plot(ax=ax, transform=ccrs.PlateCarree(),cmap='YlGnBu', levels=[10, 15, 20, 40, 60, 80, 100, 200, 300, 400, 500, 650]) ax.coastlines(); ax.gridlines(); plt.title('Map of percipitation in 2000 in mm/year') plt.show() |
Gleiches Problem wie obendrüber. Dennoch lässt sich durch die einzelnen Karten unterschiede des akkumulierten Niederschlages feststellen.