Skip to main content

Equations of state for supercooled water

Project description

waterEoS

PyPI version License: GPL v3 Python versions

Overview

waterEoS provides Python implementations of three two-state equations of state (EOS), one empirical Tait-Tammann EOS, and a two-state transport properties model for supercooled water, unified under a single SeaFreeze-compatible API. The two-state models capture the thermodynamic anomalies of water by treating it as a mixture of two interconvertible local structures (low-density/tetrahedral and high-density/disordered), predicting a liquid-liquid critical point (LLCP) in the deeply supercooled regime. The Grenke & Elliott (2025) Tait-Tammann model is a direct empirical correlation without two-state decomposition. The Singh et al. (2017) model extends the two-state framework to predict dynamic transport properties (viscosity, self-diffusion, rotational correlation time).

Installation

pip install waterEoS

Quick Start

import numpy as np
from watereos import getProp

# Single point: 0.1 MPa, 300 K
PT = np.array([[0.1], [300.0]], dtype=object)
out = getProp(PT, 'duska2020')
print(f"Density: {out.rho[0,0]:.2f} kg/m³")
print(f"Cp:      {out.Cp[0,0]:.1f} J/(kg·K)")
print(f"x:       {out.x[0,0]:.4f}")

Available Models

Model key Reference LLCP (T, P)
'holten2014' Holten, Sengers & Anisimov, J. Phys. Chem. Ref. Data 43, 014101 (2014) 228.2 K, 0 MPa
'caupin2019' Caupin & Anisimov, J. Chem. Phys. 151, 034503 (2019) 218.1 K, 72.0 MPa
'duska2020' Duska, J. Chem. Phys. 152, 174501 (2020) 220.9 K, 54.2 MPa
'grenke2025' Grenke & Elliott, J. Phys. Chem. B 129, 1997 (2025) -- (empirical)
'singh2017' Singh, Issenmann & Caupin, PNAS 114, 4312 (2017) -- (transport)
'water1' SeaFreeze water1 (pass-through) --
'IAPWS95' SeaFreeze IAPWS-95 (pass-through) --

Validity Ranges

The three two-state models accept any (T, P) input without raising errors, but results are only physically meaningful within the ranges below. The "paper-stated" range is where each model was validated by its authors; the "code-accessible" range is where the code runs without numerical failure (though results outside the paper range may be unphysical).

Model Paper-stated validity Code-accessible range
'holten2014' T_H(P)–300 K, 0–400 MPa (extrap. to 1000 MPa) Unbounded (any T, P)
'caupin2019' ~200–300 K, -140–400 MPa Unbounded (any T, P)
'duska2020' ~200–370 K, 0–100 MPa (extrap. to 200 MPa) Unbounded (any T, P)
'grenke2025' 200–300 K, 0.1–400 MPa Unbounded (any T, P)
'water1' 240–501 K, 0–2300 MPa Enforced by SeaFreeze
'IAPWS95' 240–501 K, 0–2300 MPa Enforced by SeaFreeze

Notes:

  • T_H(P) is the homogeneous ice nucleation temperature (~235 K at 0.1 MPa, ~181 K at 200 MPa).
  • Duska (2020) was fitted to data at positive pressures only; negative-pressure extrapolation is unvalidated.
  • Caupin (2019) is the only model explicitly validated at negative pressures (stretched water).
  • Grenke (2025) is a direct empirical Tait-Tammann correlation, not a two-state model. It has no x, _A, or _B outputs.
  • Singh (2017) is a transport properties model that uses Holten (2014) as its thermodynamic backbone. It returns all Holten thermodynamic properties plus eta, D, and tau_r. Its validity range matches Holten (2014).
  • Outside the paper-stated ranges, models may return unphysical values (e.g., negative compressibility or heat capacity) without warning.

Usage

Grid Mode

Evaluate on a pressure x temperature grid (like SeaFreeze):

import numpy as np
from watereos import getProp

P = np.arange(0.1, 200, 10)    # pressures in MPa
T = np.arange(250, 370, 1)     # temperatures in K
PT = np.array([P, T], dtype=object)

out = getProp(PT, 'holten2014')
# out.rho has shape (len(P), len(T))

Scatter Mode

Evaluate at specific (P, T) pairs:

import numpy as np
from watereos import getProp

PT = np.empty(3, dtype=object)
PT[0] = (0.1, 273.15)    # 0.1 MPa, 273.15 K
PT[1] = (0.1, 298.15)    # 0.1 MPa, 298.15 K
PT[2] = (100.0, 250.0)   # 100 MPa, 250 K

out = getProp(PT, 'caupin2019')
# out.rho has shape (3,)

Individual Model Access

Each model can also be imported directly:

from duska_eos import getProp
from caupin_eos import getProp
from holten_eos import getProp
from grenke_eos import getProp
from singh_viscosity import getProp

List Available Models

from watereos import list_models
print(list_models())
# ['water1', 'IAPWS95', 'holten2014', 'caupin2019', 'duska2020', 'grenke2025', 'singh2017']

Output Properties

All models return an object with the following attributes (the three two-state models also include x, _A, and _B suffixed properties; grenke2025 returns only the mixture properties):

Mixture (equilibrium) properties

Attribute Property Units
rho Density kg/m³
V Specific volume m³/kg
Cp Isobaric heat capacity J/(kg·K)
Cv Isochoric heat capacity J/(kg·K)
Kt Isothermal bulk modulus MPa
Ks Adiabatic bulk modulus MPa
Kp Pressure derivative of bulk modulus --
alpha Thermal expansivity 1/K
vel Speed of sound m/s
S Specific entropy J/(kg·K)
G Specific Gibbs energy J/kg
H Specific enthalpy J/kg
U Specific internal energy J/kg
A Specific Helmholtz energy J/kg
x Tetrahedral (LDL) fraction --

Per-state properties

Each property above (except x) is also available for the individual states with _A and _B suffixes:

  • rho_A, Cp_A, vel_A, ... (State A: high-density / disordered)
  • rho_B, Cp_B, vel_B, ... (State B: low-density / tetrahedral)

Total: 43 output properties (15 mixture + 14 state A + 14 state B).

All thermodynamic potentials (S, G, H, U, A) are aligned to the IAPWS-95 reference state.

Transport properties (singh2017 only)

Attribute Property Units
eta Dynamic viscosity Pa·s
D Self-diffusion coefficient m²/s
tau_r Rotational correlation time s
f LDS fraction (= x from Holten backbone) --

The singh2017 model also returns all Holten (2014) thermodynamic properties listed above.

Phase Diagram

Each model provides functions to compute the liquid-liquid phase diagram:

from duska_eos import compute_phase_diagram

result = compute_phase_diagram()
# result contains: T_LLCP, p_LLCP, T_spin_upper, p_spin_upper,
#                  T_spin_lower, p_spin_lower, T_binodal, p_binodal, ...

Available functions: find_LLCP(), compute_spinodal_curve(), compute_binodal_curve(), compute_phase_diagram().

Performance

Throughput on a 100x100 = 10,000-point grid:

Model Time Throughput
Holten (2014) 32 ms 317k pts/s
Caupin (2019) 18 ms 563k pts/s
Duska (2020) 49 ms 203k pts/s
Grenke (2025) 9 ms 1,116k pts/s

References

  1. V. Holten, J. V. Sengers, and M. A. Anisimov, "Equation of state for supercooled water at pressures up to 400 MPa," J. Phys. Chem. Ref. Data 43, 014101 (2014). doi:10.1063/1.4895593

  2. F. Caupin and M. A. Anisimov, "Thermodynamics of supercooled and stretched water: Unifying two-structure description and liquid-vapor spinodal," J. Chem. Phys. 151, 034503 (2019). doi:10.1063/1.5100228

  3. M. Duska, "Water above the spinodal," J. Chem. Phys. 152, 174501 (2020). doi:10.1063/5.0006431

  4. J. C. Grenke and J. R. Elliott, "Empirical fundamental equation of state for the metastable state of water based on the Tait-Tammann equation," J. Phys. Chem. B 129, 1997-2012 (2025). doi:10.1021/acs.jpcb.4c06847

  5. L. P. Singh, B. Issenmann, and F. Caupin, "Pressure dependence of viscosity in supercooled water and a unified approach for thermodynamic and dynamic anomalies of water," Proc. Natl. Acad. Sci. U.S.A. 114, 4312-4317 (2017). doi:10.1073/pnas.1619501114

Authors

  • Anthony Consiglio

License

This project is licensed under the GNU General Public License v3.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

watereos-0.4.0.tar.gz (14.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

watereos-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (552.9 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

watereos-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (548.4 kB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

watereos-0.4.0-cp39-abi3-win_amd64.whl (475.0 kB view details)

Uploaded CPython 3.9+Windows x86-64

watereos-0.4.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (548.5 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

watereos-0.4.0-cp39-abi3-macosx_11_0_arm64.whl (520.6 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

watereos-0.4.0-cp39-abi3-macosx_10_12_x86_64.whl (531.0 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

watereos-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (563.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

File details

Details for the file watereos-0.4.0.tar.gz.

File metadata

  • Download URL: watereos-0.4.0.tar.gz
  • Upload date:
  • Size: 14.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for watereos-0.4.0.tar.gz
Algorithm Hash digest
SHA256 e2df1a7d967f4a2f31b57fb9337eef76e458d88cc0119f319e9287ebbf31b140
MD5 2ede879f1ac2cf36c0942efcb1410fac
BLAKE2b-256 6816df91a5310b18553a96e43452056191d3dca5a193792f8dd4a8152173bcc1

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0.tar.gz:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for watereos-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5c16f8b5e82dafccce160626e38dd1ba1eb000f18ae86e358976ee82c0275497
MD5 a9efb2f6beb410bfa02ced27290d0694
BLAKE2b-256 62c35e96991872b48a5fb99764eb592e863baf2ec0eeab4012831dc5e5a243f8

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for watereos-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2054228ba69e0c294701299ba39cf94e5ca57028d994783d0cca11cd12f20612
MD5 30b083ef04a9d585e2a7c712b1c61aaa
BLAKE2b-256 77b0be33bfa24498ad9d3f11fc773f03f511e44367ec6ac3cda69de6b0bb61a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: watereos-0.4.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 475.0 kB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for watereos-0.4.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b957ae3faed78dfe58c661f893b259b9e0cd0ce6118736f491db07f553f21e6b
MD5 17dfcac75de367004ef4a813fd214953
BLAKE2b-256 eb36ebaf11691649dffcaab76ef5c63ed8e73d3395199b1e3e5ccd60fb2cb70d

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-cp39-abi3-win_amd64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for watereos-0.4.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e4e66314c9174840c5ae195a3675409922c99aa46250ea5fc74e035681c7bccb
MD5 44b2ae8587f91e039cf4c20b0868655f
BLAKE2b-256 fa51ad1dbfc74597c9956da8c90acb38edaafe5e78ccfe246ddbff38f485b56a

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for watereos-0.4.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c9b2e0f1ade2a36087a97d3b44fa69c172d030e16ed817be445df9cb0c9a744
MD5 c7ec52ef431deff032f316b46ea07ee6
BLAKE2b-256 c020439e7bf440b1a6dbd95292051ce144dd3b171a757a0d9a0fd5f073f2176b

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-cp39-abi3-macosx_11_0_arm64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for watereos-0.4.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 13a2fbaa91ec84c0788f05cd81fe369300d75e669443d946637e564bfb6358db
MD5 287bed290ea32ac47876581d9d7e9dba
BLAKE2b-256 1ebed1ccf90cec2353b2cf67da0ad80264a07689c96f09e87abadc4865c02c92

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-cp39-abi3-macosx_10_12_x86_64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file watereos-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for watereos-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7b656c09af988c809dcde22035e81eca870622b53c3e12fe0cce25cbde77107f
MD5 99b5219fc8d0bcf0a523641c29729dc5
BLAKE2b-256 68cd78c21cea1f31ece9bc76b566e5effa09a4ffef151f27eb9dcbfede2c3456

See more details on using hashes here.

Provenance

The following attestation bundles were made for watereos-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on anthony-consiglio/waterEoS

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page