ATM 623: Climate Modeling

Brian E. J. Rose, University at Albany

Lecture 6: Elementary greenhouse models

About these notes:

This document uses the interactive IPython notebook format (now also called Jupyter). The notes can be accessed in several different ways:

Many of these notes make use of the climlab package, available at

1. A single layer atmosphere

We will make our first attempt at quantifying the greenhouse effect in the simplest possible greenhouse model: a single layer of atmosphere that is able to absorb and emit longwave radiation.

In [1]:
from IPython.display import Image

Figure reproduced from Marshall and Plumb (2008): Atmosphere, Ocean, and Climate Dynamics


  • Atmosphere is a single layer of air at temperature $T_a$
  • Atmosphere is completely transparent to shortwave solar radiation.
  • Atmosphere is completely opaque to infrared radiation
  • Both surface and atmosphere emit radiation as blackbodies
  • Atmosphere radiates equally up and down ($A\uparrow = A\downarrow = \sigma T_a^4$)
  • There are no other heat transfer mechanisms

We can now use the concept of energy balance to ask what the temperature need to be in order to balance the energy budgets at the surface and the atmosphere, i.e. the radiative equilibrium temperatures.

Energy balance at the surface

\begin{align} \text{energy in} &= \text{energy out} \\ (1-\alpha) Q + \sigma T_a^4 &= \sigma T_s^4 \\ \end{align}

The presence of the atmosphere above means there is an additional source term: downwelling infrared radiation from the atmosphere.

We call this the back radiation.

Energy balance for the atmosphere

\begin{align} \text{energy in} &= \text{energy out} \\ \sigma T_s^4 &= A\uparrow + A\downarrow = 2 \sigma T_a^4 \\ \end{align}

which means that $$ T_s = 2^\frac{1}{4} T_a \approx 1.2 T_a $$

So we have just determined that, in order to have a purely radiative equilibrium, we must have $T_s > T_a$.

The surface must be warmer than the atmosphere.

Solve for the radiative equilibrium surface temperature

Now plug this into the surface equation to find

$$ \frac{1}{2} \sigma T_s^4 = (1-\alpha) Q $$

and use the definition of the emission temperature $T_e$ to write

$$ (1-\alpha) Q = \sigma T_e^4 $$

In fact, in this model, $T_e$ is identical to the atmospheric temperature $T_a$, since all the OLR originates from this layer.

Solve for the surface temperature: $$ T_s = 2^\frac{1}{4} T_e $$

Putting in observed numbers, $T_e = 255$ K gives a surface temperature of $$T_s = 303 ~\text{K}$$

This model is one small step closer to reality: surface is warmer than atmosphere, emissions to space generated in the atmosphere, atmosphere heated from below and helping to keep surface warm.

BUT our model now overpredicts the surface temperature by about 15ÂșC (or K).

Ideas about why?

Basically we just need to read our list of assumptions above and realize that none of them are very good approximations:

  • Atmosphere absorbs some solar radiation.
  • Atmosphere is NOT a perfect absorber of longwave radiation
  • Absorption and emission varies strongly with wavelength (atmosphere does not behave like a blackbody).
  • Emissions are not determined by a single temperature $T_a$ but by the detailed vertical profile of air temperture.
  • Energy is redistributed in the vertical by a variety of dynamical transport mechanisms (e.g. convection and boundary layer turbulence).

2. Introducing the two-layer leaky greenhouse

Let's generalize the above model just a little bit to build a slighly more realistic model of longwave radiative transfer.

We will address two shortcomings of our single-layer model:

  1. No vertical structure
  2. 100% longwave opacity

Relaxing these two assumptions gives us what turns out to be a very useful prototype model for understanding how the greenhouse effect works.


  • The atmosphere is transparent to shortwave radiation (still)
  • Divide the atmosphere up into two layers of equal mass (the dividing line is thus at 500 hPa pressure level)
  • Each layer absorbs only a fraction $\epsilon$ of whatever longwave radiation is incident upon it.
  • We will call the fraction $\epsilon$ the absorptivity of the layer.
  • Assume $\epsilon$ is the same in each layer

Note that this last assumption is appropriate is the absorption is actually carried out by a gas that is well-mixed in the atmosphere.

Out of our two most important absorbers:

  • CO$_2$ is well mixed
  • H$_2$O is not (mostly confined to lower troposphere due to strong temperature dependence of the saturation vapor pressure).

But we will ignore this aspect of reality for now.

In order to build our model, we need to introduce one additional piece of physics known as Kirchoff's Law: $$ \text{absorptivity} = \text{emissivity} $$

So if a layer of atmosphere at temperature $T$ absorbs a fraction $\epsilon$ of incident longwave radiation, it must emit $$ \epsilon ~\sigma ~T^4 $$ both up and down.

A sketch of the radiative fluxes in the 2-layer atmosphere

In [2]:
Image('../images/2layerAtm_sketch.png', retina=True)
  • Surface temperature is $T_s$
  • Atm. temperatures are $T_0, T_1$ where $T_0$ is closest to the surface.
  • absorptivity of atm layers is $\epsilon$
  • Surface emission is $\sigma T_s^4$
  • Atm emission is $\epsilon_0 \sigma T_0^4, \epsilon_1 \sigma T_1^4$ (up and down)
  • Absorptivity = emissivity for atmospheric layers
  • a fraction $(1-\epsilon)$ of the longwave beam is transmitted through each layer

Longwave emissions

Let's denote the emissions from each layer as \begin{align} E_s &= \sigma T_s^4 \ E_0 &= \epsilon \sigma T_0^4 \ E_1 &= \epsilon \sigma T_1^4 \end{align} recognizing that $E_0$ and $E_1$ contribute to both the upwelling and downwelling beams.

Shortwave radiation

Since we have assumed the atmosphere is transparent to shortwave, the incident beam $Q$ passes unchanged from the top to the surface, where a fraction $\alpha$ is reflected upward out to space.

Upwelling beam

Let $U$ be the upwelling flux of longwave radiation.

The upward flux from the surface to layer 0 is $$ U_0 = E_s $$ (just the emission from the suface).

Following this beam upward, we can write the upward flux from layer 0 to layer 1 as the sum of the transmitted component that originated below layer 0 and the new emissions from layer 0: $$ U_1 = (1-\epsilon) U_0 + E_0 $$

Continuing to follow the same beam, the upwelling flux above layer 1 is $$ U_2 = (1-\epsilon) U_1 + E_1 $$

Since there is no more atmosphere above layer 1, this upwelling flux is our Outgoing Longwave Radiation for this model:

\begin{align} OLR &= U_2 \\ &= (1-\epsilon) \bigg((1-\epsilon) \Big( \sigma T_s^4 \Big) + \epsilon \sigma T_0^4 \bigg) + \epsilon T_1^4 \\ &= (1-\epsilon)^2 \sigma T_s^4 + \epsilon(1-\epsilon) \sigma T_0^4 + \epsilon T_1^4 \end{align}

Notice that the three terms in the OLR represent the contributions to the total OLR that originate from each of the three levels.

Downwelling beam

Let $D$ be the downwelling longwave beam. Since there is no longwave radiation coming in from space, we begin with $$ D_2 = 0$$

Between layer 1 and layer 0 the beam contains emissions from layer 1: $$ D_1 = E_1 = \epsilon \sigma T_1^4$$ ( in general we can write $D_1 = (1-\epsilon)D_2 + E_1$ if we are dealing with a non-zero $D_2$)

Finally between layer 0 and the surface the beam contains a transmitted component and the emissions from layer 0: $$ D_0 = (1-\epsilon) D_1 + E_0 = \epsilon(1-\epsilon) \sigma T_1^4 + \epsilon \sigma T_0^4$$

This $D_0$ is what we call the back radiation, i.e. the longwave radiation from the atmosphere to the surface.

3. Tuning the leaky greenhouse model to observations

In building our new model we have introduced exactly one parameter, the absorptivity $\epsilon$. We need to choose a value for $\epsilon$.

We will tune our model so that it reproduces the observed global mean OLR given observed global mean temperatures.

To get appropriate temperatures for $T_s, T_0, T_1$, let's revisit the global, annual mean lapse rate plot from NCEP Reanalysis data from the previous lecture.


First, we set $$T_s = 288 \text{ K} $$

From the lapse rate plot, an average temperature for the layer between 1000 and 500 hPa is

$$ T_0 = 275 \text{ K}$$

Defining an average temperature for the layer between 500 and 0 hPa is more ambiguous because of the lapse rate reversal at the tropopause. We will choose

$$ T_1 = 230 \text{ K}$$

From the graph, this is approximately the observed global mean temperature at 275 hPa or about 10 km.


From the observed global energy budget we set

$$ OLR = 239 \text{ W m}^{-2} $$

Solving for $\epsilon$

We wrote down the expression for OLR as a function of temperatures and absorptivity in our model above. We just need to equate this to the observed value and solve a quadratic equation for $\epsilon$.

We will use the symbolic math packaged called sympy to help us out here.

In [3]:
import sympy
epsilon, T_s, T_0, T_1, sigma = sympy.symbols('epsilon, T_s, T_0, T_1, sigma')

#  Define the contributions to OLR originating from each level
OLR_s = (1-epsilon)**2 *sigma*T_s**4
OLR_0 = epsilon*(1-epsilon)*sigma*T_0**4
OLR_1 = epsilon*sigma*T_1**4

OLR = OLR_s + OLR_0 + OLR_1

print 'The expression for OLR is'
The expression for OLR is
$$T_{0}^{4} \epsilon \sigma \left(- \epsilon + 1\right) + T_{1}^{4} \epsilon \sigma + T_{s}^{4} \sigma \left(- \epsilon + 1\right)^{2}$$

Subsitute in the numerical values we are interested in:

In [4]:
OLR2 = OLR.subs([(sigma, 5.67E-8), (T_s, 288.), (T_0, 275.), (T_1, 230.)])
$$324.2752734375 \epsilon \left(- \epsilon + 1\right) + 158.669847 \epsilon + 390.0793946112 \left(- \epsilon + 1\right)^{2}$$

Now use the sympy.solve function to solve the quadratic equation for $\epsilon$:

In [5]:
sympy.solve(OLR2 - 239., epsilon)
$$\left [ 0.58377085032041, \quad 3.93287132168519\right ]$$

There are two roots, but the second one is unphysical since we must have $0 < \epsilon < 1$.

We conclude that our tuned value is

$$ \epsilon = 0.58$$

This is the absorptivity that guarantees that our model reproduces the observed OLR given the observed tempertures.

4. Level of emission

Even in this very simple greenhouse model, there is no single level at which the OLR is generated.

The three terms in our formula for OLR tell us the contributions from each level.

Let's make a row vector of these three terms:

In [6]:
OLRterms = sympy.transpose(sympy.Matrix([OLR_s, OLR_0, OLR_1]))
$$\left[\begin{matrix}T_{s}^{4} \sigma \left(- \epsilon + 1\right)^{2} & T_{0}^{4} \epsilon \sigma \left(- \epsilon + 1\right) & T_{1}^{4} \epsilon \sigma\end{matrix}\right]$$

Now evaluate these expressions for our tuned temperature and absorptivity:

In [7]:
tuned = [(T_s, 288), (T_0, 275), (T_1, 230), (epsilon, 0.58), (sigma, 5.67E-8)]
OLRtuned = OLRterms.subs(tuned)
$$\left[\begin{matrix}68.8100052094157 & 78.993456609375 & 92.02851126\end{matrix}\right]$$

So we are getting about 69 W m$^{-2}$ from the surface, 79 W m$^{-2}$ from layer 0, and 92 W m$^{-2}$ from the top layer.

In terms of fractional contributions to the total OLR, we have (limiting the output to two decimal places):

In [8]:
sympy.N(OLRtuned / 239., 2)
$$\left[\begin{matrix}0.29 & 0.33 & 0.39\end{matrix}\right]$$

Notice that the largest single contribution is coming from the top layer. This is in spite of that the emissions from this layer are weak, because it is so cold.

Comparing to observations, the actual contribution to OLR from the surface is about 22 W m$^{-2}$ (or about 9% of the total), not 69 W m$^{-2}$. So we certainly don't have all the details worked out yet!

As we will see later, to really understand what sets that observed 22 W m$^{-2}$, we will need to start thinking about the spectral dependence of the longwave absorptivity.

5. Radiative forcing in the 2-layer leaky greenhouse

Adding some extra greenhouse absorbers will mean that a greater fraction of incident longwave radiation is absorbed in each layer.

Thus $\epsilon$ must increase as we add greenhouse gases.

Suppose we have $\epsilon$ initially, and the absorptivity increases to $\epsilon_2 = \epsilon + \delta_\epsilon$.

Suppose further that this increase happens abruptly so that there is no time for the temperatures to respond to this change. We hold the temperatures fixed in the column and ask how the radiative fluxes change.

Do you expect the OLR to increase or decrease?

Let's use our two-layer leaky greenhouse model to investigate the answer.

The components of the OLR before the perturbation are

In [9]:
$$\left[\begin{matrix}T_{s}^{4} \sigma \left(- \epsilon + 1\right)^{2} & T_{0}^{4} \epsilon \sigma \left(- \epsilon + 1\right) & T_{1}^{4} \epsilon \sigma\end{matrix}\right]$$

After the perturbation we have

In [10]:
delta_epsilon = sympy.symbols('delta_epsilon')
OLRterms_pert = OLRterms.subs(epsilon, epsilon+delta_epsilon)
$$\left[\begin{matrix}T_{s}^{4} \sigma \left(- \delta_{\epsilon} - \epsilon + 1\right)^{2} & T_{0}^{4} \sigma \left(\delta_{\epsilon} + \epsilon\right) \left(- \delta_{\epsilon} - \epsilon + 1\right) & T_{1}^{4} \sigma \left(\delta_{\epsilon} + \epsilon\right)\end{matrix}\right]$$

Let's take the difference

In [11]:
deltaOLR = OLRterms_pert - OLRterms
$$\left[\begin{matrix}- T_{s}^{4} \sigma \left(- \epsilon + 1\right)^{2} + T_{s}^{4} \sigma \left(- \delta_{\epsilon} - \epsilon + 1\right)^{2} & - T_{0}^{4} \epsilon \sigma \left(- \epsilon + 1\right) + T_{0}^{4} \sigma \left(\delta_{\epsilon} + \epsilon\right) \left(- \delta_{\epsilon} - \epsilon + 1\right) & - T_{1}^{4} \epsilon \sigma + T_{1}^{4} \sigma \left(\delta_{\epsilon} + \epsilon\right)\end{matrix}\right]$$

To make things simpler, we will neglect the terms in $\delta_\epsilon^2$. This is perfectly reasonably because we are dealing with small perturbations where $\delta_\epsilon << \epsilon$.

Telling sympy to set the quadratic terms to zero gives us

In [12]:
deltaOLR_linear = sympy.expand(deltaOLR).subs(delta_epsilon**2, 0)
$$\left[\begin{matrix}2 T_{s}^{4} \delta_{\epsilon} \epsilon \sigma - 2 T_{s}^{4} \delta_{\epsilon} \sigma & - 2 T_{0}^{4} \delta_{\epsilon} \epsilon \sigma + T_{0}^{4} \delta_{\epsilon} \sigma & T_{1}^{4} \delta_{\epsilon} \sigma\end{matrix}\right]$$

Recall that the three terms are the contributions to the OLR from the three different levels. In this case, the changes in those contributions after adding more absorbers.

Now let's divide through by $\delta_\epsilon$ to get the normalized change in OLR per unit change in absorptivity:

In [13]:
deltaOLR_per_deltaepsilon = sympy.simplify(deltaOLR_linear / delta_epsilon)
$$\left[\begin{matrix}2 T_{s}^{4} \sigma \left(\epsilon - 1\right) & T_{0}^{4} \sigma \left(- 2 \epsilon + 1\right) & T_{1}^{4} \sigma\end{matrix}\right]$$

Now look at the sign of each term. Recall that $0 < \epsilon < 1$. Which terms in the OLR go up and which go down?


The contribution from the surface must decrease, while the contribution from the top layer must increase.

When we add absorbers, the average level of emission goes up!

"Radiative forcing" is the change in radiative flux at TOA after adding absorbers

In this model, only the longwave flux can change, so we define the radiative forcing as

$$ R = - \delta OLR $$

(with the minus sign so that $R$ is positive when the climate system is gaining extra energy).

We just worked out that whenever we add some extra absorbers, the emissions to space (on average) will originate from higher levels in the atmosphere.

What does this mean for OLR? Will it increase or decrease?

To get the answer, we just have to sum up the three contributions we wrote above:

In [14]:
R = -sum(deltaOLR_per_deltaepsilon)
$$- T_{0}^{4} \sigma \left(- 2 \epsilon + 1\right) - T_{1}^{4} \sigma - 2 T_{s}^{4} \sigma \left(\epsilon - 1\right)$$

Is this a positive or negative number? The key point is this:

It depends on the temperatures, i.e. on the lapse rate.

Greenhouse effect for an isothermal atmosphere

Stop and think about this question:

If the surface and atmosphere are all at the same temperature, does the OLR go up or down when $\epsilon$ increases (i.e. we add more absorbers)?

Understanding this question is key to understanding how the greenhouse effect works.

Let's solve the isothermal case

We will just set $T_s = T_0 = T_1$ in the above expression for the radiative forcing.

In [15]:
R.subs([(T_0, T_s), (T_1, T_s)])
$$- T_{s}^{4} \sigma \left(- 2 \epsilon + 1\right) - 2 T_{s}^{4} \sigma \left(\epsilon - 1\right) - T_{s}^{4} \sigma$$

which then simplifies to

In [16]:
sympy.simplify(R.subs([(T_0, T_s), (T_1, T_s)]))

The answer is zero

For an isothermal atmosphere, there is no change in OLR when we add extra greenhouse absorbers. Hence, no radiative forcing and no greenhouse effect.


The level of emission still must go up. But since the temperature at the upper level is the same as everywhere else, the emissions are exactly the same.

The radiative forcing (change in OLR) depends on the lapse rate!

For a more realistic example of radiative forcing due to an increase in greenhouse absorbers, we can substitute in our tuned values for temperature and $\epsilon$.

We'll express the answer in W m$^{-2}$ for a 1% increase in $\epsilon$.

The three components of the OLR change are

In [17]:
deltaOLR_per_deltaepsilon.subs(tuned) * 0.01
$$\left[\begin{matrix}-3.27666691473408 & -0.5188404375 & 1.58669847\end{matrix}\right]$$

And the net radiative forcing is

In [18]:
R.subs(tuned) * 0.01

So in our example, the OLR decreases by 2.2 W m$^{-2}$, or equivalently, the radiative forcing is +2.2 W m$^{-2}$.

What we have just calculated is this:

Given the observed lapse rates, a small increase in absorbers will cause a small decrease in OLR.

The greenhouse effect thus gets stronger, and energy will begin to accumulate in the system -- which will eventually cause temperatures to increase as the system adjusts to a new equilibrium.

6. Radiative equilibrium in the 2-layer leaky greenhouse

In the previous section we made no assumptions about the processes that actually set the temperatures. We used the model to calculate radiative fluxes, given observed temperatures. We stressed the importance of knowing the lapse rates in order to know how an increase in emission level would affect the OLR, and thus determine the radiative forcing.

A key question in climate dynamics is therefore this:

What sets the lapse rate?

It turns out that lots of different physical processes contribute to setting the lapse rate. Understanding how these processes acts together and how they change as the climate changes is one of the key reasons for which we need more complex climate models.

For now, we will use our prototype greenhouse model to do the most basic lapse rate calculation: the radiative equilibrium temperature.

We assume that

  • the only exchange of energy between layers is longwave radiation
  • equilibrium is achieved when the net radiative flux convergence in each layer is zero.
In [19]:
E_s = sigma*T_s**4
E_0 = epsilon*sigma*T_0**4
E_1 = epsilon*sigma*T_1**4
E = sympy.Matrix([E_s, E_0, E_1])
$$\left[\begin{matrix}T_{s}^{4} \sigma\\T_{0}^{4} \epsilon \sigma\\T_{1}^{4} \epsilon \sigma\end{matrix}\right]$$

The upwelling beam

In [20]:
U = sympy.Matrix([E_s, (1-epsilon)*E_s + E_0, (1-epsilon)*((1-epsilon)*E_s + E_0) + E_1])
$$\left[\begin{matrix}T_{s}^{4} \sigma\\T_{0}^{4} \epsilon \sigma + T_{s}^{4} \sigma \left(- \epsilon + 1\right)\\T_{1}^{4} \epsilon \sigma + \left(- \epsilon + 1\right) \left(T_{0}^{4} \epsilon \sigma + T_{s}^{4} \sigma \left(- \epsilon + 1\right)\right)\end{matrix}\right]$$

The downwelling beam

In [21]:
fromspace = 0
D = sympy.Matrix([(1-epsilon)*((1-epsilon)*fromspace + E_1) + E_0, (1-epsilon)*fromspace + E_1, fromspace])
$$\left[\begin{matrix}T_{0}^{4} \epsilon \sigma + T_{1}^{4} \epsilon \sigma \left(- \epsilon + 1\right)\\T_{1}^{4} \epsilon \sigma\\0\end{matrix}\right]$$
In [22]:
# Net flux, positive up
F = sympy.simplify(U - D)
$$\left[\begin{matrix}\sigma \left(- T_{0}^{4} \epsilon + T_{1}^{4} \epsilon \left(\epsilon - 1\right) + T_{s}^{4}\right)\\\sigma \left(T_{0}^{4} \epsilon - T_{1}^{4} \epsilon - T_{s}^{4} \left(\epsilon - 1\right)\right)\\\sigma \left(T_{1}^{4} \epsilon - \left(\epsilon - 1\right) \left(T_{0}^{4} \epsilon - T_{s}^{4} \left(\epsilon - 1\right)\right)\right)\end{matrix}\right]$$
In [23]:
# The absorption is then simply the flux convergence in each layer

# define a vector of absorbed radiation -- same size as emissions
A = E.copy()

#  absorbed radiation at surface
A[0] = F[0]
# Get the convergence
for n in range(2):
    A[n+1] = -(F[n+1]-F[n])

A = sympy.simplify(A)
$$\left[\begin{matrix}\sigma \left(- T_{0}^{4} \epsilon + T_{1}^{4} \epsilon \left(\epsilon - 1\right) + T_{s}^{4}\right)\\\epsilon \sigma \left(- 2 T_{0}^{4} + T_{1}^{4} \epsilon + T_{s}^{4}\right)\\\epsilon \sigma \left(T_{0}^{4} \epsilon - 2 T_{1}^{4} - T_{s}^{4} \epsilon + T_{s}^{4}\right)\end{matrix}\right]$$
In [24]:
# Solve for radiative equilibrium by setting this equal to zero
T_e = sympy.symbols('T_e')
sympy.solve(A - sympy.Matrix([sigma*T_e**4, 0, 0]),[T_s**4, T_1**4, T_0**4])
$$\left \{ T_{0}^{4} : - \frac{T_{e}^{4} \left(\epsilon + 1\right)}{\epsilon - 2}, \quad T_{1}^{4} : - \frac{T_{e}^{4}}{\epsilon - 2}, \quad T_{s}^{4} : - \frac{T_{e}^{4} \left(\epsilon + 2\right)}{\epsilon - 2}\right \}$$

The radiative equilibrium solution is thus

\begin{align} T_s &= T_e \left( \frac{2+\epsilon}{2-\epsilon} \right)^{1/4} \\ T_1 &= T_e \left( \frac{1+\epsilon}{2-\epsilon} \right)^{1/4} \\ T_2 &= T_e \left( \frac{ 1}{2 - \epsilon} \right)^{1/4} \end{align}

Plugging in $\epsilon = 0.58$ gives

\begin{align} T_s &= 296 \text{ K} \\ T_0 &= 262 \text{ K} \\ T_1 &= 234 \text{ K} \\ \end{align}

Compare these to the values we derived from the observed lapse rates: \begin{align} T_s &= 288 \text{ K} \ T_0 &= 275 \text{ K} \ T_1 &= 230 \text{ K} \ \end{align}

The radiative equilibrium solution is substantially warmer at the surface and colder in the lower troposphere than reality.

This is a very general feature of radiative equilibrium, and we will see it again very soon in this course.

A follow-up assignment

You are now ready to tackle Assignment 5, where you are asked to extend this grey-gas analysis to many layers.

For more than a few layers, the analytical approach we used here is no longer very useful. You will code up a numerical solution to calculate OLR given temperatures and absorptivity, and look at how the lapse rate determines radiative forcing for a given increase in absorptivity.

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

Version information

In [25]:
%load_ext version_information
%version_information numpy, sympy, climlab
Installed To use it, type:
  %load_ext version_information
Python2.7.9 64bit [GCC 4.2.1 (Apple Inc. build 5577)]
OSDarwin 14.3.0 x86_64 i386 64bit
Thu May 14 16:02:40 2015 EDT


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.