Published June 15, 2026 | Version v1.5.0
Software Open

pyEQL: A python library for water chemistry

Authors/Creators

  • 1. Princeton University

Description

Major Changes in pyEQL v1.5.0

  • NEW FEATURE Solution.get_saturation_index(): pyEQL can now display saturation indices for solid phases when using the native, phreeqc, or phreeqc2026 engines. (#395, @SuixiongTay, @YitongPan1)
  • NEW DEFAULT BEHAVIOR NativeEOS: the native modeling engine (the default) now uses the natively-developed Phreeqc2026EOS for speciation calculations, rather than the legacy PhreeqcEOS which was based on phreeqpython. Both PHREEQC wrappers are still available; the only thing that has changed in this release is which one the native modeling engine uses. (#422, @rkingsbury)
  • Added python 3.14; dropped python 3.10 support.
  • Many bugfixes and small enhancements

Full Changelog

[1.5.0] - 2026-06-15

Added

  • NEW FEATURE Solution.get_saturation_index(): pyEQL can now display saturation indices for solid phases when using the native, phreeqc, or phreeqc2026 engines. (#395, @SuixiongTay, @YitongPan1)
  • Solution.alkalinity: Alkalinity calculations now include an alternative definition based on the presence of weak acid-base species. Previously, the calculation only considered conservative cations and strong base anions, which meant that a solution that contained only weak acid/base species would return zero alkalinity. (#398, @SuixiongTay)
  • Solution.get_transference_number: New method alias to get_transport_number (#420, @rkingsbury)
  • Added python 3.14 support (#404, @rkingsbury)
  • Docs: new charge balancing tutorial (#391, @SuixiongTay)
  • Docs: new tutorial for solid-liquid-gas equilibrium (#390, @YitongPan1)
  • Solution.__init__ now checks whether the supplied pH and pE conditions are within the electrochemical stability limits of water, and logs a warning if they are not (#385, @YitongPan1)

Changed

  • NEW DEFAULT BEHAVIOR NativeEOS: the native modeling engine (the default) now uses the natively-developed Phreeqc2026EOS for speciation calculations, rather than the legacy PhreeqcEOS which was based on phreeqpython. Both PHREEQC wrappers are still available; the only thing that has changed in this release is which one the native modeling engine uses. (#422, @rkingsbury)
  • Solution.__init__: solutes can now be given using additional, common environmental unit abbreviations such as "ppm", "ppb", etc., aligning with the unit types supported in get_amount() (#414, @SuixiongTay)
  • get_transport_number: Clarify that the quantity returned by this method is really the transference number, which is equal to the transport number whenever there are no concentration or pressure gradients. Also added a new method get_transference_number as an alias. (#420, @rkingsbury)
  • utils.interpret_units was renamed to utils.translate_units() (#414, @SuixiongTay)
  • Solute properties are now pre-cached to enhance performance, especially when creating Solutions containing a large number of solutes (#384, @rkingsbury)
  • migrate from pymatgen to [pymatgen-core](https://github.com/materialsproject/pymatgen-core). (#403, @rkingsbury)

Fixed

  • Phreeqc2026EOS: an error in the __deepcopy__ method prevented this class from functioning properly with some Solution methods, such as arithmetic (+). (#421, @rkingsbury)
  • from_preset/ from_dict: there was a subtle bug in the calculation of solution volumes that could cause a pH / H+ inconsistency when re-creating solutions from dict or files. This primarily affected solutions with many solutes and the discrepancy was small in quantitative terms, but prevented some presets from loading correctly.
  • Solution.__init__: fix the way the moles of solvent are initially calculated. The previous approach contained an error and also used a fixed water concentration of 55.55 mol/L regardless of temperature or pressure. The calculation now uses the internal water_substance to retrieve the correct density and calculate the molarity. The flaw in the original method did not affect quantitative results because the initial amount of moles was immediately overwritten by add_amount during __init__. (#406, @rkingsbury)
  • utils.standardize_formula(): Triiodide ion now correctly renders as Br3[-1] rather than Br[-0.33333333] (#410, @rkingsbury)
  • utils.standardize_formula(): Sulfur species with fractional oxidation states such as S5[-2], S4[-2], S3 [-2], and S2[-2] now render correctly. Previously they were rendered as S[-0.4], S[-0.5], S[-0.66666667], and S[-1] (#416, @SuixiongTay)
  • Docs: fixed issues with the built docs (#402, @YitongPan1; #401, @SuixiongTay)
  • Packaging: remove .gitignore'ed files from scikit-build-core sdist (#392, @vineetbansal)

Removed

  • Dropped python 3.10 support (#404, @rkingsbury)

Files

KingsburyLab/pyEQL-v1.5.0.zip

Files (14.5 MB)

Name Size Download all
md5:62dadc5501b43cca0223ff778b4cc20e
14.5 MB Preview Download

Additional details

Related works