CO2-H2O System#

Low-Temperature Geochemistry

In this session, we will derive the governing equations of the \(CO_2\)-\(H_2O\) system under closed and open system conditions.

# import relevant modules

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from IPython.display import display
%%javascript
MathJax.Hub.Config({
    TeX: { equationNumbers: { autoNumber: "AMS" } }
});
MathJax.Hub.Queue(
  ["resetEquationNumbers", MathJax.InputJax.TeX],
  ["PreProcess", MathJax.Hub],
  ["Reprocess", MathJax.Hub]
);

Consider the dissociation of a weak poly-protic acid (\(H_2CO_3\)) in water at \(25^\circ C\) and an atmospheric pressure of \(1\) bar.

(1) \(H_2CO_3\) dissociates to form hydrogen ions (\(H^+\)) and bicarbonate ions (\(HCO_{3}^{-}\))

\[H_2CO_3 = HCO_{3}^{-} + H^+\]
(292)#\[K_1 = \frac{a_{H^+} \cdot a_{HCO_{3}^{-}}}{a_{H_2CO_3}} = 10^{-6.35}\]

(2) \(HCO_{3}^{-}\) dissociates to form hydrogen ions and carbonate ions (\(CO_{3}^{2-}\))

\[HCO_{3}^{-} = CO_{3}^{2-} + H^+\]
(308)#\[K_2 = \frac{a_{H^+} \cdot a_{CO_{3}^{2-}}}{a_{HCO_{3}^{-}}} = 10^{-10.33}\]

(3) Dissociation of water

\[H_2O = H^+ + OH^-\]
(309)#\[K_W = \frac{a_{H^+} \cdot a_{OH^-}}{a_{H_2O}} = 10^{-14}\]

(4) Charge balance (all solutions are electrically neutral). Note that we need to balance concentrations (\(m\)), not activities (\(a\)), as concentrations represent actual quantities of ions.

(310)#\[m_{H^+} = m_{HCO_{3}^{-}} + 2m_{CO_{3}^{2-}} + m_{OH^-}\]

Now we have \(5\) unknowns (\(m_{H^+}, m_{H_2CO_3}, m_{HCO_{3}^{-}}, m_{CO_{3}^{2-}}, m_{OH^-}\)) but only \(4\) equations. We need the fifth equation in order to solve the simultaneous equations. Fortunately, we can get it from the boundary conditions, i.e. what we know about the system.

For a closed system, the boundary condition is that the total amount of \(CO_2\) in the system is fixed. As \(H_2CO_3\), \(HCO_{3}^{-}\), and \(CO_{3}^{2-}\) form when \(CO_2\) dissolves in water, so

(296)#\[m_{total} = m_{H_2CO_3} + m_{HCO_{3}^{-}} + m_{CO_{3}^{2-}} \]

Recalling the relationship between concentration and activity:

\[m_i = \frac{a_i}{y_i}\]

We will assume that \(y_{H_2CO_3} = y_{HCO_{3}^{-}} = y_{CO_{3}^{2-}} = y_{OH^-} = 1\), so \(m_i = a_i\).

And recall that

\[pH = -\log(m_{H^+}) \quad \longrightarrow \quad m_{H^+}=10^{-pH}\]

From (292), \(m_{H^+}=10^{-pH}\), rearranging it and using the assumption, we get:

(297)#\[m_{HCO_{3}^{-}} = \frac{K_1 \cdot m_{H_2CO_3}}{10^{-pH}}\]

From \(m_{H^+}=10^{-pH}\), (308) and (297), using the assumption, we get:

(298)#\[m_{CO_{3}^{2-}} = \frac{K_2 \cdot K_1 \cdot m_{H_2CO_3}}{10^{-2 \cdot pH}}\]

Substituting (297) and (298) into (296), we get:

\[m_{total} = m_{H_2CO_3} + \frac{K_1 \cdot m_{H_2CO_3}}{10^{-pH}} + \frac{K_2 \cdot K_1 \cdot m_{H_2CO_3}}{10^{-2 \cdot pH}}\]
\[m_{total} = m_{H_2CO_3} \left(\frac{K_1}{10^{-pH}} + \frac{K_2 \cdot K_1}{10^{-2 \cdot pH}}\right)\]
\[m_{H_2CO_3} = \frac{m_{total}}{\left(\frac{K_1}{10^{-pH}} + \frac{K_2 \cdot K_1}{10^{-2 \cdot pH}}\right)}\]

We will define a new parameter \(F_H\) as

\[F_H = \frac{K_1}{10^{-pH}} + \frac{K_2 \cdot K_1}{10^{-2 \cdot pH}}\]

So,

(299)#\[m_{H_2CO_3} = \frac{m_{total}}{F_H}\]

Substituting (299) into (297) and (298), we get:

(300)#\[m_{HCO_{3}^{-}} = \frac{m_{total} \cdot K_1}{F_H \cdot 10^{-pH}}\]
(301)#\[m_{CO_{3}^{2-}} = \frac{m_{total} \cdot K_2 \cdot K_1}{F_H \cdot 10^{-2 \cdot pH}}\]

The derivations of (299), (300) and (301) lead to the speciation of the carbon system as a function of \(pH\), as shown below.

# function for calculating F_H, m_H2CO3, m_HCO3-, m_CO3--, m_H+, m_OH-
def FH(pH):
    K1 = 10**-6.35
    K2 = 10**-10.33
    return 1+(K1/(10**-pH))+(K2*K1/(10**(-2*pH)))

def m_H2CO3(m_total, pH):
    return m_total/FH(pH)

def m_HCO3(m_total, pH):
    K1 = 10**-6.35
    return m_total*K1/(FH(pH)*(10**-pH))

def m_CO3(m_total, pH):
    K1 = 10**-6.35
    K2 = 10**-10.33
    return m_total*K2*K1/(FH(pH)*(10**(-2*pH)))

def m_H(pH):
    return 10**-pH

def m_OH(pH):
    return 10**-(14-pH)

# plot
plt.figure(figsize=(8,6))
m_total = 0.01  # set m_total value
pH = np.linspace(1, 13, 100)
plt.plot(pH, m_H2CO3(m_total, pH), 'r', label='$H_2CO_3$')  # H2CO3
plt.plot(pH, m_HCO3(m_total, pH), 'g', label='$HCO_{3}^{-}$')  # HCO3-
plt.plot(pH, m_CO3(m_total, pH), 'b', label='$CO_{3}^{2-}$')  # CO3--
plt.plot(pH, m_H(pH), '#FFB53C', label='$H^+$')  # H+
plt.plot(pH, m_OH(pH), '#3CF0FF', label='$OH^-$')  # OH-
plt.plot(6.35, m_H2CO3(m_total, 6.35), 'ko')  # the point where m_H2CO3=m_HCO3-
plt.plot([6.35, 6.35], [0, m_H2CO3(m_total, 6.35)], 'k:')
plt.text(5.5, 0.015, '$pH=6.35$', fontsize=14)
plt.plot(10.33, m_HCO3(m_total, 10.33), 'ko')  # the point where m_HCO3-=m_CO3--
plt.plot([10.33, 10.33], [0, m_HCO3(m_total, 10.33)], 'k:')
plt.text(9.4, 0.015, '$pH=10.33$', fontsize=14)
plt.xlabel('$pH$')
plt.ylabel('Activity $(mol/kg)$')
plt.xlim([1, 13])
plt.ylim([10**-8, 1])
plt.yscale("log")
plt.title('Speciation of the carbon system as a function of pH', fontsize=14)
plt.legend(loc='best', fontsize=10)
<matplotlib.legend.Legend at 0x1fd60a9e460>
../../_images/CO2_H2O_System_4_1.png

From the plot above, it can be seen that there are two points where the concentrations (activities) of two carbon-bearing species are equal.

  1. \(m_{H_2CO_3} = m_{HCO_{3}^{-}}\)

\[\frac{(a)}{(b)} = \frac{m_{H_2CO_3}}{m_{HCO_{3}^{-}}} = \frac{\left(\frac{m_{total}}{F_H}\right)}{\left(\frac{m_{total} \cdot K_1}{F_H \cdot 10^{-pH}}\right)} = \frac{10^{-pH}}{K_1}\]

\(\quad\)If \(m_{H_2CO_3} = m_{HCO_{3}^{-}}\), so

\[\frac{10^{-pH}}{K_1} = 1\]
\[\therefore pH = pK_1 = 6.35\]
  1. \(m_{HCO_{3}^{-}} = m_{CO_{3}^{2-}}\)

\[\frac{(b)}{(c)} = \frac{m_{HCO_{3}^{-}}}{m_{CO_{3}^{2-}}} = \frac{\left(\frac{m_{total} \cdot K_1}{F_H \cdot 10^{-pH}}\right)}{\left(\frac{m_{total} \cdot K_2 \cdot K_1}{F_H \cdot 10^{-2 \cdot pH}}\right)} = \frac{10^{-pH}}{K_2}\]

\(\quad\)If \(m_{HCO_{3}^{-}} = m_{CO_{3}^{2-}}\), so

\[\frac{10^{-pH}}{K_2} = 1\]
\[\therefore pH = pK_2 = 10.33\]

Next, we will consider an open system at \(25^\circ C\) and an atmospheric pressure of \(1\) bar with a constant atmospheric partial pressure of \(CO_2\) (\(pCO_2\))

Some \(CO_2\) in the air will dissolve in water. The amount of dissolved \(CO_2\) follows Henry’s law.

\[K_H \cdot pCO_2 = (CO_2)_{aq}\]
(302)#\[K_H = \frac{a_{(CO_2)_{aq}}}{P_{CO_2}}\]

Some dissolved \(CO_2\) will react with water to form carbonic acid:

\[(CO_2)_{aq} + H_2O = H_2CO_3\]
(303)#\[K_0 = \frac{a_{H_2CO_3}}{a_{(CO_2)_{aq}} \cdot a_{H_2O}} = \frac{a_{H_2CO_3}}{a_{(CO_2)_{aq}}}\]

Rearranging (302) and (303), we get:

(304)#\[a_{(CO_2)_{aq}} = K_H \cdot P_{CO_2}\]
(305)#\[a_{H_2CO_3} = K_0 \cdot a_{(CO_2)_{aq}}\]

Substituting (304) into (305), we get:

(306)#\[a_{H_2CO_3} = K_0 \cdot K_H \cdot P_{CO_2}\]

Combine both of the carbon-bearing species in water as \(H_2CO_3^*\)

\[a_{H_2CO_3^* } = a_{(CO_2)_{aq}} + a_{H_2CO_3}\]
\[= K_H \cdot P_{CO_2} + K_0 \cdot K_H \cdot P_{CO_2}\]
\[= K_H \cdot (1+K_0) \cdot P_{CO_2}\]

In reality, \(K_H >> K_0\), so \(a_{(CO_2)_{aq}} >> a_{H_2CO_3}\), and

\[a_{H_2CO_3^*} \approx K_H \cdot P_{CO_2}\]

Recall (292), (308), (309), (310), (302), but rewrite (292) and (302):

\[H_2CO_3^* = HCO_{3}^{-} + H^+\]
(307)#\[K_1 = \frac{a_{H^+} \cdot a_{HCO_{3}^{-}}}{a_{H_2CO_3^{* }}} = 10^{-6.35}\]
(308)#\[K_2 = \frac{a_{H^+} \cdot a_{CO_{3}^{2-}}}{a_{HCO_{3}^{-}}} = 10^{-10.33}\]
(309)#\[K_W = \frac{a_{H^+} \cdot a_{OH^-}}{a_{H_2O}} = 10^{-14}\]
(310)#\[m_{H^+} = m_{HCO_{3}^{-}} + 2m_{CO_{3}^{2-}} + m_{OH^-}\]
\[K_H \cdot pCO_2 = H_2CO_3^{* }\]
(311)#\[K_H = \frac{a_{H_2CO_3^{* }}}{P_{CO_2}} \quad \longrightarrow \quad a_{H_2CO_3^{* }} = K_H \cdot P_{CO_2}\]

Substituting (311) into (307), and rearranging, we get:

(312)#\[a_{HCO_{3}^{-}} = \frac{K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}}\]

Substituting (299) into (308), and rearranging, we get:

(313)#\[a_{CO_{3}^{2-}} = \frac{K_2 \cdot K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}^2}\]

Rearranging (309), we get:

(314)#\[a_{OH^-} = \frac{K_W}{a_{H^+}}\]

Applying \(m_i = \frac{a_i}{y_i}\) to (310), we get:

\[\frac{a_{H^+}}{y_{H^+}} = \frac{a_{HCO_{3}^{-}}}{y_{HCO_{3}^{-}}} + 2\cdot\frac{a_{CO_{3}^{2-}}}{y_{CO_{3}^{2-}}} + \frac{a_{OH^-}}{y_{OH^-}}\]

Substituting (312), (313) and (314), we get:

\[\frac{1}{y_{H^+}} \left(a_{H^+}\right) = \frac{1}{y_{HCO_{3}^{-}}} \left(\frac{K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}}\right) + \cdot\frac{2}{y_{CO_{3}^{2-}}} \left(\frac{K_2 \cdot K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}^2}\right) + \frac{1}{y_{OH^-}} \left(\frac{K_W}{a_{H^+}}\right)\]

\(y_{H^+}, y_{HCO_{3}^{-}}, y_{CO_{3}^{2-}}\), and \(y_{OH^-}\) can be calculated, but …

  • Calculation depends on ionic strength,

  • …which depends on concentration of ions,

  • …which we don’t know

This can be solved “iteratively”, but we won’t cover this technique here.

We will here assume \(y_{H^+} = y_{HCO_{3}^{-}} = y_{CO_{3}^{2-}} = y_{OH^-} = 1\), so

\[a_{H^+} = \left(\frac{K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}}\right) + 2\cdot\left(\frac{K_2 \cdot K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}^2}\right) + \left(\frac{K_W}{a_{H^+}}\right)\]

If multiplying this equation by \(a_{H^+}^2\), we will get a cubic equation \(a_{H^+}^3 - B \cdot a_{H^+} + C = 0\) that can be solved exactly. However, we can simplify it using a few assumptions.

  1. \(K_1>>K_2\)

  2. By (310), \(m_{OH^-}<m_{H^+}\) in the presence of any \(HCO_3^-\) or \(CO_3^{2-}\)

By the assumptions, the last two terms are then negligible, and the equation becomes:

\[a_{H^+}^2 = K_1 \cdot K_H \cdot P_{CO_2}\]

For pure water, \(K_H=10^{-1.47}\), \(K_1=10^{-6.35}\), and \(K_2=10^{-10.33}\).

Given that \(P_{CO_2} = 409\,ppm = 10^{-3.39}\),

\[a_{H^+}^2 = 10^{-6.35} \cdot 10^{-1.47} \cdot 10^{-3.39}\]
\[\therefore a_{H^+} = 10^{-5.61} \longrightarrow pH = 5.61\]

This indicates that water in equilibrium with atmospheric \(CO_2\) is acidic! If rain has a pH < 5.61, it is “acid” rain.

We can also find the activities of other species.

By (312), \(a_{HCO_{3}^{-}} = 10^{-5.61} \,mol/kg\)

By (313), \(a_{CO_{3}^{2-}} = 10^{-10.33} \,mol/kg\)

By (314), \(a_{OH^{-}} = 10^{-8.39} \,mol/kg\)

By eq5star, \(a_{H_2CO_3^{* }} = 10^{-4.86} \,mol/kg\)

Consider the equation below again:

\[a_{H^+}^2 = K_1 \cdot K_H \cdot P_{CO_2}\]

Taking negative 10-base log, we get:

\[-\log(a_{H^+}^2) = -log(K_1 \cdot K_H \cdot P_{CO_2})\]
\[2 \cdot pH = pK_1 + pK_H - \log P_{CO_2}\]
\[pH = -\frac{1}{2}\log P_{CO_2} + c\]

where \(c = \frac{pK_1 + pK_H}{2}\)

Then, we can plot the relationship between \(P_{CO_2}\) and \(pH\) of water at equilibrium with atmospheric \(CO_2\) as follows.

# function for calculating F_H, m_H2CO3, m_HCO3-, m_CO3--, m_H+, m_OH-
def pH_eq(pCO2):
    pK1 = 6.35
    pKH = 1.47
    c = (pK1+pKH)/2
    return -0.5*np.log10(pCO2) + c

# plot
plt.figure(figsize=(8,6))
pCO2 = np.linspace(10**-10, 1, 100)
log_pCO2_rain = -3.39
pH_rain = pH_eq(10**-3.39)
plt.plot(np.log10(pCO2), pH_eq(pCO2), 'b')
plt.plot(log_pCO2_rain, pH_rain, 'ro', label='rain')  # rain
plt.plot([log_pCO2_rain, log_pCO2_rain], [0, pH_rain], 'g:')
plt.plot([-10, log_pCO2_rain], [pH_rain, pH_rain], 'g:')
plt.text(-3.3, 5.8, r'$({0:.2f},{1:.1f})$'.format(log_pCO2_rain, pH_rain), fontsize=14)
plt.xlim([-10, 0])
plt.ylim([3.5, 9.5])
plt.xlabel('$\log(P_{CO_2})$')
plt.ylabel('$pH$')
plt.title('A plot of $pH$ of water at equilibrium against atmospheric pressure of $CO_2$', fontsize=14)
plt.legend(loc='best', fontsize=10)
<matplotlib.legend.Legend at 0x1fd60c6b850>
../../_images/CO2_H2O_System_8_1.png

Lesson 4 - Problem 2#

a) Use the main relations linking the carbon system species to calculate the relative activity between \(H_2CO_3\) and \(HCO_3^-\) under the following conditions using the data in the table below:

\(\quad\)(i) At \(25^\circ C\) for a water sample whose \(pH=4.0\).

\(\quad\)(ii) At \(60^\circ C\) for a water sample whose \(pH=4.0\). How different is that from your previous answer in part i)?

# Table

# data
T = [0, 5, 10, 15, 20, 25, 30, 45, 60]
pK1 = [6.58, 6.52, 6.46, 6.42, 6.38, 6.35, 6.33, 6.29, 6.29]
pK2 = [10.63, 10.55, 10.49, 10.43, 10.38, 10.33, 10.29, 10.20, 10.14]

# create a dataframe
dict = {'T (C)' : T,
        'pK1' : pK1,
       'pK2' : pK2}
df = pd.DataFrame(dict)

# displaying the dataFrame
display(df.style.hide_index().set_precision(2))
T (C) pK1 pK2
0 6.58 10.63
5 6.52 10.55
10 6.46 10.49
15 6.42 10.43
20 6.38 10.38
25 6.35 10.33
30 6.33 10.29
45 6.29 10.20
60 6.29 10.14
# create a function to calculate the relative activity between H2CO3 and HCO3- (a_H2CO3/a_HCO3-)
def H2CO3_HCO3_activity_ratio(pH, Temp):
    T = [0, 5, 10, 15, 20, 25, 30, 45, 60]
    pK1 = [6.58, 6.52, 6.46, 6.42, 6.38, 6.35, 6.33, 6.29, 6.29]
    if Temp in T:
        return 10**(-pH-(-pK1[T.index(Temp)]))
    else:
        return "No data for your input"

# (i)
T = 25; pH = 4
ratio_i = H2CO3_HCO3_activity_ratio(pH, T)
print(f"(i) There is {ratio_i:.0f} time more carbonic acid than bicarbonate ions in a water sample at \
{T} C and pH={pH}.")
                    
# (ii)
T = 60; pH = 4
ratio_ii = H2CO3_HCO3_activity_ratio(pH, T)
print(f"(ii) There is {ratio_ii:.0f} time more carbonic acid than bicarbonate ions in a water sample at \
{T} C and pH={pH}.")

# compare
print(f"There is {ratio_ii:.0f}/{ratio_i:.0f}={ratio_ii/ratio_i:.2f} times as much bicarbonate at higher temperature.")
(i) There is 224 time more carbonic acid than bicarbonate ions in a water sample at 25 C and pH=4.
(ii) There is 195 time more carbonic acid than bicarbonate ions in a water sample at 60 C and pH=4.
There is 195/224=0.87 times as much bicarbonate at higher temperature.

b) Calculate the \(pH\) of rainwater at equilibrium with atmospheric \(CO_2\) at \(25^\circ C\) today? Assume that concentrations and activities are the same. The challenge of this question is to find a way to express \(pH\) (or \(a_{H^+}\)). This involves making simplifications to the charge balance equation: \(m_{H^+}=m_{HCO_3^-}+2m_{CO_3^{2-}}+m_{OH^-}\). The key being to argue that \(m_{H^+} \approx m_{HCO_3^-}\) for rain.

We have done that (\(pH=5.6\)).

c) A groundwater sample has a measured \(pH\) of \(6.84\) and a \(HCO_3^-\) concentration \(460\,mg/L\). Assuming that activity equal concentration, calculate the \(P_{CO_2}\) of this groundwater sample.

\(\quad\)(i) First, convert the units from \(mg/L\) to \(mol/kg\)

\(\quad\)(ii) Since we have \(pH\), we can use the expression between \(P_{CO_2}\) and \(HCO_3^-\):

\[a_{HCO_{3}^{-}} = \frac{K_1 \cdot K_H \cdot P_{CO_2}}{a_{H^+}}\]

and solve for \(P_{CO_2}\).

\(\quad\)(iii) How does the \(P_{CO_2}\) in that groundwater compare with the current atmospheric \(P_{CO_2}\) levels (\(409\,ppm\)). Will the \(CO_2\) contained in that sample remain in solution, or will it degas into the atmosphere?

(i)

\[m_{HCO_{3}^{-}} = a_{HCO_{3}^{-}} = 460\cdot10^{-3} \frac{g}{L} \cdot \frac{1}{61.0}\frac{mol}{g} \cdot \frac{1}{1}\frac{L}{kg} = 7.54\cdot10^{-3} \frac{mol}{kg}\]

(ii)

The expression of \(P_{CO_2}\) can be written as:

\[P_{CO_2} = \frac{a_{HCO_{3}^{-}} \cdot 10^{-pH}}{K_1 \cdot K_H}\]

We can simplify by taking the log on both sides.

\[\log P_{CO_2} = \log \left( \frac{a_{HCO_{3}^{-}} \cdot 10^{-pH}}{K_1 \cdot K_H} \right)\]
\[= -pH + pK_1 + pK_H + \log a_{HCO_{3}^{-}}\]
\[= -6.84+6.35+1.47+\log(7.54\cdot10^{-3})\]
\[= -1.14\]

So, \(P_{CO_2} = 10^{-1.14} = 72443\,ppm\)!

(iii)

This is \(177\) times more than the current atmospheric \(P_{CO_2}\) levels, it is supersaturated. The \(CO_2\) contained in that sample will be released into the atmosphere is that water ever comes in contact with the atmosphere.

References#

  • Lecture slide and Practical for Lecture 4 of the Low-Temperature Geochemistry module