Calculate ocean pCO2 and pH from DIC, alkalinity, and temperature

Set Seawater Parameters

Seawater properties

MODEL DESCRIPTION

This web app calculates the partial pressure of CO\(_2\) (pCO\(_2\)) and pH of seawater in equilbrium with the atmosphere given sea-surface temperature, titration alkalinity, and dissolved inorganic carbon.

The calculation is based on simplified carbonate equilibria including dissolved CO\(_2\), bicarbonate ion [HCO\(_{3}^-\)], carbonate ion [CO\(_{3}^{2-}\)], hydrogen ion [H\(^+\)], and borate [HBO\(_3^-\)]. Both phosphate [PO\(_4^{3-}\)] and silicic acid H\(_{2}\) SiO\(_4\) are neglected. The simplification is intended to represent large-scale mean conditions and is probably not accurate to better than about 1 ppmv of pCO\(_2\).

The model is based on a discussion in an article by Pieter Tans (1996). You can read all the gory details in the “Chemistry” tab to the right of this one.

The program that does the calculation is very simple, and the code that controls this website is surprisingly simple too! It is all written in the programming language R, using a web programming package called shiny. You can read all about it on the “Website Code” tab to the right.

Simplified Carbonate Chemistry of Seawater

The discussion below is based on an article by Pieter Tans (1998). Readers interested in a more in-depth presentation might want to refer to classic textbooks by Sarmiento and Gruber (2006, Chapters 8-10) or Williams and Follows (2011, Chapter 6).

Dissolved carbon dioxide in water forms carbonic acid (H2CO3), which dissociates twice to form protons (H+), bicarbonate (HCO3-) and carbonate (CO32-) ions in solution. In equilibrium, we have

The equilibria in (1) through (3) provide a system of three equations in five unknowns (pCO\(_2\), [CO\(_2\)(aq)], [HCO\(_3^-\)], [CO\(_3^{2-}\)], and [H\(^+\)] or pH). To solve, we need two additional constraints. We add additional equations for titration alkalinity (TA) and total dissolved inorganic carbon (DIC), both of which are commonly measured:

In some areas of the ocean, we have to be more inclusive in specifying alkalinity to include nitrate, phosphate, and silica. This is especially important where there's a lot of biology. According to Follows et al (2006), neglecting these species typically leads to errors in pCO\(_2\) of order 1 ppmv, so we'll just stick with the simpler formulation here.

In most cases, the alkalinity is made up almost entirely of the bacarbonate and carbonate anions, whose sum is sensibly called the “carbonate alkalinity (CA).” But since we can't directly measure CA, it's usually calculated by subtracting the minor ions from the (measured) TA.

In (5), [B(OH)\(_4^-\)] is the concentration of the borate ion produced by the dissociation of Boric acid (B(OH)\(_3\), and yes, this is the stuff your mother used to put in your eyes). Uh oh! Now we've introduced yet another unknown (borate), so we have to add yet another constraint as well. But this is no big deal.

It turns out that the element-by-element composition of sea salt is almost perfectly identical everywhere in the sea, though it's more dilute in some places than and more concentrated (“saline”“) in others. So it's easy to know the total amount of Boron in the water if we just know the salinity.

The total Boron in any seawater sample is a fixed fraction of the salinity, so

Believe it or not, we've now got 6 equations (1) - (6) in six unknowns! The equilibrium coefficients K\(_0\), K\(_1\), K\(_2\), and K\(_B\) have all been measured very accurately as functions of temperature and salinity, and just get plugged into the equations as "constants.” We use the values from the Tans chapter (his Table 12.1) here. You can read or copy/paste the R code by clicking the Website Code tab to the right.

To solve the carbonate system, we first use (1), (2), and (3) to write

Starting with DIC and TA and a “first guess” of pH = 8, we solve (10) for CA, then substitute the value into (9) and solve the quaratic for a new estimate of [H\(^+\)]. Then we iterate equations (10) and (9) until the resulting estimates of [H\(^+\)] converge.

Once the iteration converges, we just substitute the value of [H\(^+\)] back into (1), (2), and (3) to obtain [CO\(_3^{2-}\)], [HCO\(_3^-\)], [CO\(_2\)(aq)], and pCO\(_2\).

It is also useful to calculate the “Revelle buffer factor,” which is approximately

\[
R = \frac{DIC}{[CO_3^{2-}]}.
\]

The Revelle factor indicates the fractional change in pCO\(_2\) per fractional change in DIC, and is about 10 for current global mean conditions. This means that doubling atmospheric pCO\(_2\) (a 100% increase) would lead to only a 10% increase in marine DIC.

The iterative solution and then backsubstitution is a lot simpler than it sounds. To read the code, click the “Website Code” tab to the right.