This document uses the interactive `IPython notebook`

format (now also called `Jupyter`

). The notes can be accessed in several different ways:

- The interactive notebooks are hosted on
`github`

at https://github.com/brian-rose/ClimateModeling_courseware - The latest versions can be viewed as static web pages rendered on nbviewer
- A complete snapshot of the notes as of May 2015 (end of spring semester) are available on Brian's website.

Many of these notes make use of the `climlab`

package, available at https://github.com/brian-rose/climlab

The **amount of solar radiation** incident on the top of the atmosphere (what we call the "insolation") depends on

- latitude
- season
- time of day

This insolation is the primary driver of the climate system. Here we will examine the geometric factors that determine insolation, focussing primarily on the **daily average** values.

We define the **solar zenith angle** $\theta_s$ as the angle between the local normal to Earth's surface and a line between a point on Earth's surface and the sun.

In [1]:

```
from IPython.display import Image
Image('../images/Hartmann_Fig2.5.png')
```

Out[1]:

We can write the solar flux per unit surface area as

$$ Q = S_0 \left( \frac{\overline{d}}{d} \right)^2 \cos \theta_s $$where $\overline{d}$ is the mean distance for which the flux density $S_0$ (i.e. the solar constant) is measured, and $d$ is the actual distance from the sun.

Question:

- what factors determine $\left( \frac{\overline{d}}{d} \right)^2$ ?
- under what circumstances would this ratio always equal 1?

Just like the flux itself, the solar zenith angle depends latitude, season, and time of day.

The seasonal dependence can be expressed in terms of the **declination angle** of the sun: the latitude of the point on the surface of Earth directly under the sun at noon (denoted by $\delta$).

$\delta$ currenly varies between +23.45Âº at northern summer solstice (June 21) to -23.45Âº at northern winter solstice (Dec. 21).

The **hour angle** $h$ is defined as the longitude of the subsolar point relative to its position at noon.

With these definitions and some spherical geometry (see Appendix A of Hartmann's book), we can express the solar zenith angle for any latitude $\phi$, season, and time of day as

$$ \cos \theta_s = \sin \phi \sin \delta + \cos\phi \cos\delta \cos h $$If $\cos\theta_s < 0$ then the sun is below the horizon and the insolation is zero (i.e. it's night time!)

Sunrise and sunset occur when the solar zenith angle is 90Âº and thus $\cos\theta_s=0$. The above formula then gives

$$ \cos h_0 = - \tan\phi \tan\delta $$where $h_0$ is the hour angle at sunrise and sunset.

Near the poles special conditions prevail. Latitudes poleward of 90Âº-$\delta$ are constantly illuminated in summer, when $\phi$ and $\delta$ are of the same sign. Right at the pole there is 6 months of perpetual daylight in which the sun moves around the compass at a constant angle $\delta$ above the horizon.

In the winter, $\phi$ and $\delta$ are of opposite sign, and latitudes poleward of 90Âº-$|\delta|$ are in perpetual darkness. At the poles, six months of daylight alternate with six months of daylight.

At the equator day and night are both 12 hours long throughout the year.

Substituting the expression for solar zenith angle into the insolation formula gives the instantaneous insolation as a function of latitude, season, and time of day:

$$ Q = S_0 \left( \frac{\overline{d}}{d} \right)^2 \Big( \sin \phi \sin \delta + \cos\phi \cos\delta \cos h \Big) $$which is valid only during daylight hours, $|h| < h_0$, and $Q=0$ otherwise (night).

To get the daily average insolation, we integrate this expression between sunrise and sunset and divide by 24 hours (or $2\pi$ radians since we express the time of day in terms of hour angle):

$$ \overline{Q}^{day} = \frac{1}{2\pi} \int_{-h_0}^{h_0} Q ~dh$$$$ = \frac{S_0}{2\pi} \left( \frac{\overline{d}}{d} \right)^2 \int_{-h_0}^{h_0} \Big( \sin \phi \sin \delta + \cos\phi \cos\delta \cos h \Big) ~ dh $$which is easily integrated to get our formula for daily average insolation:

$$ \overline{Q}^{day} = \frac{S_0}{\pi} \left( \frac{\overline{d}}{d} \right)^2 \Big( h_0 \sin\phi \sin\delta + \cos\phi \cos\delta \sin h_0 \Big)$$where the hour angle at sunrise/sunset $h_0$ must be in radians.

It turns out that, due to optical properties of the Earth's surface (particularly bodies of water), the surface albedo depends on the solar zenith angle. It is therefore useful to consider the average solar zenith angle during daylight hours as a function of latidude and season.

The appropriate daily average here is weighted with respect to the insolation, rather than weighted by time. The formula is

$$ \overline{\cos\theta_s}^{day} = \frac{\int_{-h_0}^{h_0} Q \cos\theta_s~dh}{\int_{-h_0}^{h_0} Q ~dh} $$In [2]:

```
Image('../images/Hartmann_Fig2.8.png')
```

Out[2]:

Here are some examples calculating daily average insolation at different locations and times.

These all use a function called `daily_insolation`

in the module `climlab.solar.insolation.py`

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.

To look at past orbital variations and their effects on insolation, we use the module `climlab.solar.orbital.py`

which accesses tables of values for the past 5 million years. We can easily lookup parameters for any point in the past and pass these to `daily_insolation`

.

In [3]:

```
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc
from climlab import constants as const
from climlab.solar.insolation import daily_insolation
from climlab.solar.orbital import OrbitalTable
```

First, get a little help on using the `daily_insolation`

function:

In [4]:

```
help(daily_insolation)
```

Here are a few simple examples.

First, compute the daily average insolation at 45ÂºN on January 1:

In [5]:

```
daily_insolation(45,1)
```

Out[5]:

Same location, July 1:

In [6]:

```
daily_insolation(45,181)
```

Out[6]:

In [7]:

```
lat = np.linspace(-90., 90., 30.)
Q = daily_insolation(lat, 80)
plt.plot(lat,Q)
plt.xlim(-90,90)
plt.xticks([-90,-60,-30,-0,30,60,90])
plt.xlabel('Latitude')
plt.grid()
plt.title('Daily average insolation on March 21')
```

Out[7]:

Try to answer the following questions **before reading the rest of these notes**.

- What is the daily insolation today here at Albany (latitude 42.65ÂºN)?
- What is the
**annual mean**insolation at the latitude of Albany? - At what latitude and a what time of year does the maximum insolation occur?
- What latitude is experiencing either
**polar sunrise**or**polar sunset**today?

In [8]:

```
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.

In [9]:

```
ax = plt.figure( figsize=(10,8) ).add_subplot(111)
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=[0., 0.] )
plt.show()
```

Take the area-weighted global, annual average of Q...

In [10]:

```
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:

In [11]:

```
summer_solstice = 170
winter_solstice = 353
ax = plt.figure( figsize=(10,8) ).add_subplot(111)
ax.plot( lat, Q[:,(summer_solstice, winter_solstice)] );
ax.plot( lat, np.mean(Q, axis=1), linewidth=2 )
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()
plt.show()
```

[Back to ATM 623 notebook home](../index.html)

The author of this notebook is Brian E. J. Rose, University at Albany.

It was developed in support of ATM 623: Climate Modeling, a graduate-level course in the Department of Atmospheric and Envionmental Sciences, offered in Spring 2015.

In [12]:

```
%install_ext http://raw.github.com/jrjohansson/version_information/master/version_information.py
%load_ext version_information
%version_information numpy, climlab
```

Out[12]:

In [ ]:

```
```