So far we’ve been working with a model of the global mean temperature. We will soon be adding some x and y dependence – thinking about the equator-to-pole structure of climate.
In order to do this, we have to first start thinking about the spatial structure of the incoming solar radiation.
Draw sketch:
Global mean insolation = total energy received by planet / surface area of planet:
$$ Q = \frac{S_0 \pi a^2 }{4 \pi a^2 } = \frac{S_0}{4} = 341 \text{ W m}^{-2} $$That’s what we’ve been using so far, because we’ve only been treating the global average climate.
From the geometry of the sphere we see that the sunlight is NOT AT ALL evenly distributed in latitude.
Draw sketches of the orientation of the Earth’s axis relative to the sun at:
Make sure it’s clear that seasons are primarily associated with the tilt of the axis!
Current obliquity is about 23.5º
Here are some examples calculating daily average insolation at different locations and times.
These all use a function called
daily_insolation
in the package
climlab.solar.insolation
to do the calculation. The code implements the above formulas to calculates daily average insolation anywhere on Earth at any time of year.
The code takes account of orbital parameters to calculate current Sun-Earth distance.
We can look up past orbital variations to compute their effects on insolation using the package
climlab.solar.orbital
See the next lecture!
daily_insolation
function¶%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from climlab import constants as const
from climlab.solar.insolation import daily_insolation
First, get a little help on using the daily_insolation
function:
help(daily_insolation)
Here are a few simple examples.
First, compute the daily average insolation at 45ºN on January 1:
daily_insolation(45,1)
Same location, July 1:
daily_insolation(45,181)
We could give an array of values. Let's calculate and plot insolation at all latitudes on the spring equinox = March 21 = Day 80
lat = np.linspace(-90., 90., 30)
Q = daily_insolation(lat, 80)
fig, ax = plt.subplots()
ax.plot(lat,Q)
ax.set_xlim(-90,90); ax.set_xticks([-90,-60,-30,-0,30,60,90])
ax.set_xlabel('Latitude')
ax.set_ylabel('W/m2')
ax.grid()
ax.set_title('Daily average insolation on March 21');
Try to answer the following questions before reading the rest of these notes.
Calculate an array of insolation over the year and all latitudes (for present-day orbital parameters). We'll use a dense grid in order to make a nice contour plot
lat = np.linspace( -90., 90., 500 )
days = np.linspace(0, const.days_per_year, 365 )
Q = daily_insolation( lat, days )
And make a contour plot of Q as function of latitude and time of year.
fig, ax = plt.subplots(figsize=(10,8))
CS = ax.contour( days, lat, Q , levels = np.arange(0., 600., 50.) )
ax.clabel(CS, CS.levels, inline=True, fmt='%r', fontsize=10)
ax.set_xlabel('Days since January 1', fontsize=16 )
ax.set_ylabel('Latitude', fontsize=16 )
ax.set_title('Daily average insolation', fontsize=24 )
ax.contourf ( days, lat, Q, levels=[-1000., 0.], colors='k' )
Take the area-weighted global, annual average of Q...
Qaverage = np.average(np.mean(Q, axis=1), weights=np.cos(np.deg2rad(lat)))
print( 'The annual, global average insolation is %.2f W/m2.' %Qaverage)
Also plot the zonally averaged insolation at a few different times of the year:
summer_solstice = 170
winter_solstice = 353
fig, ax = plt.subplots(figsize=(10,8))
ax.plot(lat, Q[:, summer_solstice], label='NH summer solstice')
ax.plot(lat, Q[:, winter_solstice], label='NH winter solstice')
ax.plot( lat, np.mean(Q, axis=1), linewidth=2, label='Annual average')
ax.set_xbound(-90, 90)
ax.set_xticks( range(-90,100,30) )
ax.set_xlabel('Latitude', fontsize=16 );
ax.set_ylabel('Insolation (W m$^{-2}$)', fontsize=16 );
ax.grid(); ax.legend();
ax.set_title('Daily average insolation', fontsize=24)