Carbon Dioxide and Seawater

An Eccentric Anomaly: Ed Davies's Blog


In the same Green Building Forum discussion as the previous comments about Stefan's Law, which I blogged about, Tony also made remarks about warming possibly causing the increase of CO₂ in the atmosphere rather than being the result of it. His idea seems to be that warming of the oceans causes them to be less able to dissolve CO₂ so it comes out of solution and bubbles up into the atmosphere.

...and the rises in the levels of CO2 could even be an effect of these rises rather the cause of them were the rises to be due to some other factor.
As the temperature of seawater rises we know that it can't hold so much dissolved CO2 so at least some of it must be a result of that.

I think this is ridiculous. Here's why.

First of all, it just doesn't make sense with what climate science knows about the amounts of CO₂ humans are producing, the amount which stays in the atmosphere (the airborne fraction) and the amounts which appear to be going into the land biota and the ocean. Secondly, it rather fails to account for the fact that the oceans are become more acid (well, less alkaline). But if you are sufficiently wilful in your ignorance to come up with that sort of argument in the first place that's not going to be very convincing.

A meta-argument might be that if anything so simple could make sense there are plenty of people who would have made the argument already. Consider that there are typically some 20'000 geologists, geophysicists, planetary scientists and so on at the AGU Fall Conference almost all of whom would be well motivated to come up with a paper showing this (either just to make a good reputation for themselves or because their careers involve mineral extraction) - but they don't. But again, if you have some sort of conspiracy notion that there's a cabal of scientists deliberately trying to mislead people then that's not going to help much, either.

About the only argument I can imagine being at all persuasive would be one which actually calculates some approximation of what the effect of the current warming might be. It's the sort of thing you can work out on the back of an envelope though if you're going to show much of the background and logic it had better be a largish envelope. Here goes...

In working this out I've written a few small Python scripts which I'll show. (Actually I mostly just cobbled them together from other bits of code I already had to hand.) They're just a convenient way for me to do this and document the process; they're not essential and somebody who didn't want to or couldn't do the programming could do the same thing with a spreadsheet or just as paper calculations, particularly if they were a bit slicker at maths than me.


The whole issue of CO₂ movement into and out of the oceans as the climate changes is complicated because of the various reactions that the simply dissolved CO₂ has with other chemicals. Tony, whose GBF profile says he has a PhD in organic chemistry, could probably make a bit more sense of all this than I can.

Luckily, I don't think it matters. As I understand it, the direct transfer of CO₂ between the sea water and the air happens via the dissolved form and the amount dissolved depends, in equilibrium, only on the temperature and the partial pressure of CO₂ in the atmosphere above.

Henry's Law says that, at a given temperature, the amount of a gas dissolved in a liquid is directly proportional to the partial pressure of that gas above the liquid. The dependence of the constant of proportionality on the temperature is also given in that Wikipedia article.

So if we ignore the quantities of gas moving backwards and forwards and just consider the concentration in the sea water and the partial pressures in the atmosphere it should be easy to work out what's going on. The approach, therefore, is to estimate the concentration in the water during some starting period then see what effect subsequent temperature changes would have on the partial pressure in the atmosphere if the concentration didn't change. This can then be compared to the actual partial pressures recorded to determine if the net effect will have been for CO₂ to come out of or go into the ocean.

Of course, the real world is a bit more complicated than this. Temperatures vary widely as do concentrations of CO₂ in the water and the atmosphere. Still, calculating the effects of the observed temperature changes from a sensible range of starting temperatures should give a clear idea if there's any possibility of the reduced dissolving abilities of sea water having a noticeable effect on the atmosphere's CO₂ content.

Partial Pressures

Here's some code which extracts the concentrations of CO₂ in the atmosphere as measured at the top of Mauna Loa (the Keeling Curve) and returns the averages for the decades for which there are a useful number of measurements.


import os.path as path

def mlo():
    """ Yield the monthly parts per million of CO₂ measured on Mauna Loa. 
        Data from:
    for l in open(path.join(
        if l.startswith('1') or l.startswith('2'):
            s = l.split(',')
            year = int(s[0])
            assert((1958 <= year) and (year <= 2100))
            month = int(s[1])
            assert((1 <= month) and (month <= 12))
            ppmv = float(s[4])
            if ppmv != -99.99:
                assert((300 < ppmv) and (ppmv <= 450))
                yield year, month, ppmv
def decade(year):
    """ Return the decade of a particular year. """
    return int(year/10) * 10
def partialPressure(ppmv):
    """ Return the partial pressure of a gas in the air at sea level given
        its mole fraction in parts per million and assuming standard air
        pressure (101.325 kPa).
        Result in pascals.
    return ppmv/1e6 * 101325
_decades = None                # Information on the decades for which we have
                                # useful data. Found by mloPerDecade when needed.

def mloPerDecade():
    """ Yield information about the decades with at least 100 months of data. """
    global _decades
    # Read in if first time through.
    if _decades == None:
        # Accumulate data for each of the decades.
        decades = {}
        for year, _, ppmv in mlo():
            d = decade(year)
            if not d in decades:
                class a: start_year = d; end_year = d + 9; count = 0; total = 0
                decades[d] = a
            decades[d].total += ppmv
            decades[d].count += 1
        # Convert dictionary into a sorted list and get rid of the decades with
        # not much data.
        _decades = sorted(
                    filter(lambda a: a.count >= 100,
                    key=lambda a: a.start_year)

        # Calculate averages and average partial pressures.
        for a in _decades:
            a.ppmv = / a.count
            a.pp = partialPressure(a.ppmv)
            a.ppmvString = '%3.2f' % a.ppmv
            a.ppString = '%3.3f' % a.pp
    # Actually return results
    for a in _decades:
        yield a
def yearRange():
    """ Return the range of years for which the MLO data has (nearly) complete
        decades of data. """
    return _decades[0].start_year, _decades[-1].end_year

Here are the results produced.

Decade Concentration
Pressure (Pa)
1960/1969 320.27 32.451
1970/1979 330.89 33.528
1980/1989 345.33 34.991
1990/1999 360.43 36.521
2000/2009 378.45 38.346

So from the 1960s to the 2000s the partial pressure of CO₂ in the atmosphere went up from about 32.5 pascals to about 38.3 pascals.

Sea Surface Temperature

As well as the CO₂ partial pressures we need the sea surface temperatures to work out what's going in. Here's some code to extract the annual sea-surface temperature anomalies published by the UK Met Office.


""" Reading and processing of sea-surface temperature data from the
    UK Met Office Hadley Centre. """

import os.path as path
import mlo

def HadSSTdata():
    """ Annual data referenced from
        Yield year and temperature tuples.
    for l in open(path.join(
        s = l.split()
        yield int(s[0]), float(s[1])
def sstForMloDecades():
    """ Yield averaged anomalies for the decades for which we have sufficient
        Mauna Loa CO₂ concentrations. """
    def Decade(d):
        class D: start_year=d.start_year; end_year=d.end_year; total=0; count=0
        return D
    decades = [ Decade(d) for d in mlo.mloPerDecade() ]
    decadeDict = { d.start_year: d for d in decades }
    for year, anomaly in HadSSTdata():
        d = mlo.decade(year)
        if d in decadeDict:
            d = decadeDict[d]
   += anomaly
            d.count += 1
    for d in decades:
        d.anomaly = / d.count
        d.anomalyString = "%2.4f" % d.anomaly
        yield d

Graphing this data for the decades for which we have Mauna Loa CO₂ data (using gives us:

Averaging the anomalies for those decades gives:

Anomaly (°C)
1960/1969 -0.0134
1970/1979 -0.0706
1980/1989 0.0472
1990/1999 0.1971
2000/2009 0.3364

The largest increase during the period is from the 1970s' anomaly of -0.0706 °C (relative to whatever arbitrary average the HadSSTs are measured from) to the 2000s' 0.3364 °C for a total of 0.407 °C. Let's call it 0.5 °C to be generous.

Henry's Law

As mentioned above, Henry's Law governs the relationship between the concentrations of CO₂ in the ocean and in the atmosphere above it. Again, we'll wrap this up in some code


""" Calculations of partial pressures of gasses above solutions of those
    gasses in another liquid.

import math
from mlo import mloPerDecade

# Carbon dioxide above water.
class CO2_water:
    TΘ = 298.15                # Reference temperature, kelvins.
    khΘ = 3.4e-2               # Henry's law coefficient at reference temperature. mol/(l·atm)
    C = 2400                   # Coefficient of log temperature dependence, kelvins.
def T(t):
    """ Return an absolute temperature in kelvins given a temperature in °C. """
    return t + 273.15

def khcp(gas, t):
    """ Return the Henry's law coefficient for the given temperature (°C).
        Result in mol/(m³·Pa).
        That is, the number of moles of the gas which will be held in solution
        in a cubic metre of the liquid by a gas pressure above of one pascal.
    return gas.khΘ * math.exp(gas.C * (1/T(t) - 1/gas.TΘ)) * (1000 / 101325)
def concentrations():
    """ Yield, for a range of plausible sea-surface temperatures, the calculated
        conditions for the 1960s and, using the sea-water CO₂ concentration 
        from then, the corresponding conditions for the 2000s. """
    # Find the first decade for which we have enough Mauna Loa atmospheric CO₂ 
    # data (that is, for the 1960s).
    firstMloDecade = next(mloPerDecade())
    # Do calculations for a reasonable range of sea-surface temperatures.
    for t in range(0, 21, 5):
        # Create an object we can conveniently store our working for this
        # temperature.
        class c:
            class start: pass           # Conditions in the first decade (1960s)
            class end: pass             # Conditions in the last decade (2000s)
        # Set up the first decade's conditions.
        c.start.t = t
        c.start.pp = firstMloDecade.pp
        c.start.conc = khcp(CO2_water, t) * c.start.pp
        # Work out the last decade's conditions.
        c.end.t = t + 0.5
        c.end.conc = c.start.conc
        c.end.pp = c.end.conc / khcp(CO2_water, c.end.t)
        # See how much the partial pressure of CO₂ changes.
        c.deltaPP = c.end.pp - c.start.pp
        # Format the numbers to avoid showing silly precision.
        for r in (c.start, c.end):
            r.t = "%2.1f" % r.t
            r.pp = "%2.4f" % r.pp
            r.conc = "%1.6f" % r.conc
        c.deltaPP = "%1.4f" % c.deltaPP
        yield c
1960s 2000s Partial
change (Pa)
Atmospheric CO₂
partial pressure (Pa)
Concentration in
Concentration in
Atmospheric CO₂
partial pressure (Pa)
0.0 32.4515 0.022749 0.5 0.022749 32.9767 0.5252
5.0 32.4515 0.019425 5.5 0.019425 32.9578 0.5063
10.0 32.4515 0.016680 10.5 0.016680 32.9400 0.4885
15.0 32.4515 0.014399 15.5 0.014399 32.9231 0.4716
20.0 32.4515 0.012492 20.5 0.012492 32.9070 0.4555


In other words, if the concentration of CO₂ in the seawater stayed at the levels implied by 1960s amounts of CO₂ in the atmosphere then the effect of the sort of rises in temperature of the sea surface we've seen up to the 2000s would be an increase in atmospheric CO₂ partial pressure of about 0.5 Pa. If there were no other sources of CO₂ then this would mean that the amount in the seawater water would decrease though without understanding a lot more about the chemistry it's difficult to say by how much. This would, in turn, reduce the increase in the atmospheric CO₂ but again it's hard to say by how much.

This 0.5 or so pascal increase in atmospheric partial pressure is very small compared to the nearly 6 Pa (32.5 to 38.3 Pa) increase actually seen. Therefore, it seems likely that the net flow of CO₂ over this period has been into the ocean and the effect of warming, via the reduction in dissolving capacity of the water, will have done nothing more than slow down this solution process a small amount. Assuming this all makes approximate sense, ocean warming cannot be a significant contributor to the increase in atmospheric CO₂.