# Total calcium affects saturation states but not equilibrium constants in (Py)CO2SYS

**URL:** <https://systemco2.net/t/total-calcium-affects-saturation-states-but-not-equilibrium-constants-in-py-co2sys/30>\
**Category:** Help, research and resources\
**Tags:** co2sys-excel, co2sys-msdos, co2sys-matlab, pyco2sys\
**Created:** [15 September 2026 22:18 UTC](https://systemco2.net/t/total-calcium-affects-saturation-states-but-not-equilibrium-constants-in-py-co2sys/30 "2026-09-15T22:18:36Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![mvdh](https://systemco2.net/user_avatar/systemco2.net/mvdh/32/17_2.png) [@mvdh](https://systemco2.net/u/mvdh)\
**Post date:** [15 September 2026 22:18 UTC](https://systemco2.net/t/total-calcium-affects-saturation-states-but-not-equilibrium-constants-in-py-co2sys/30/1 "2026-09-15T22:18:36Z")

</div>

The total calcium content is calculated internally in (Py)CO2SYS as a linear function of salinity, following either [Riley & Tongudai (1967)](https://doi.org/10.1016/0009-2541(67)90026-5) or Culkin (1965) depending on the settings.

In PyCO2SYS it’s also possible for you the user to provide an alternative value to use instead of the internal calculation, which might be desirable for example in the vicinity of rivers with elevated [Ca2+] at low salinity.

### Changing [Ca2+] affects carbonate mineral saturation states

Whether calculated from salinity or provided by the user, the only place where the [Ca2+] value is used is in the equation

Ω = [Ca2+][CO32–] / _K_sp(_T_, _S_, _p_)

which has a different _K_sp for calcite and aragonite. _K_sp itself is _not_ a function of [Ca2+]. And more generally:

### Changing [Ca2+] does not affect equilibrium constants

In reality, changes in major ion composition affect the values of the stoichiometric equilibrium constants used to solve for equilibrium in (Py)CO2SYS. However, this effect is _not_ present in (Py)CO2SYS, where the solution composition’s influence on all equilibrium constants is parameterised as functions of salinity.

If values for equilibrium constants that _do_ include the effects of [Ca2+] variations have been calculated using an alternative (e.g., Pitzer) model they can be provided as arguments to PyCO2SYS, in which case they will be used instead of the internally evaluated values - just like [Ca2+].

---

<div class="post-metadata">

**Author:** ![burke.hales](https://systemco2.net/user_avatar/systemco2.net/burke.hales/32/49_2.png) [@burke.hales](https://systemco2.net/u/burke.hales)\
**Post date:** [18 September 2026 23:28 UTC](https://systemco2.net/t/total-calcium-affects-saturation-states-but-not-equilibrium-constants-in-py-co2sys/30/2 "2026-09-18T23:28:19Z")

</div>

spot on… mostly!

Ksp is fundamentally a thermodynamic property, defined only by the inherent energetics of the reaction and the ‘true’ thermodynamic state values T and P. If were to work exclusively in rigorous activity space instead of concentration space, there would be no S or Ca dependence whatsoever, as these affect neither the state variables or the inherent energetics. But none of us do, and so the activity coefficient corrections are huge and the reason for the ~100x greater apparent concentration-based solubility in seawater than freshwater.

That activity coefficient correction is all caught up in the empirical S dependences that our elders (ha! I’m old!) figured out for us (thanks, Al M!), so as long as the Ca:S relationship stays ~constant, then the Ksp effect of varying Ca is captured. Neither R&T67 or C65 are different enough from each other to significantly affect the activity coefficient dependence on Ca.

Great answer, Matthew.
