fugacio-thermo
Differentiable thermodynamics and physical-property engine for the Fugacio stack. Every model is written in JAX, so any output (a fugacity coefficient, a saturation pressure, a flash result) is differentiable with respect to temperature, pressure, composition, and model parameters. The iterative solvers (cubic-EOS root, flash, saturation, bubble/dew) carry hand-written implicit-function-theorem rules, so gradients flow exactly through them rather than through unrolled iterations.
No call returns a plausible number from a failed solve. Each iterative
calculation has a checked *_with_info form that returns the best iterate and a
SolveReport (with statuses such as OUT_OF_DOMAIN and TRIVIAL), and its
value-only form returns NaN when that report fails. Derivatives of a failed
solve are nonfinite.
What's inside
- Curated open component database (
DATABASE,get,component_arrays): critical constants, acentric factors, Antoine coefficients, and ideal-gas heat capacities for common species. - Ideal-gas properties:
cp_ig,enthalpy_ig,entropy_ig,gibbs_ig(plus mixture variants). - Cubic equations of state: van der Waals, Redlich-Kwong, SRK, Peng-Robinson
(
VDW,RK,SRK,PR), with mixing rules, a differentiable compressibility solver, fugacity coefficients (ln_phi_mixture,ln_phi_pure), and molar volume. - Residual properties: departure functions (
residual_enthalpy,residual_entropy,residual_gibbs,residual_cp,residual_properties) on the cubic equations of state. - Property packages (
PropertyPackage,cubic_package,gamma_phi_package,saft_package,helmholtz_package): the one model type, an object that owns phase equilibrium and energy for a component set, implemented for every method class. Each package provides single-phaseenthalpy,entropy,volume,gibbs, andheat_capacity; two-phasemixture_enthalpy/mixture_entropy/mixture_volume; PT, PH (isenthalpic), and PS (isentropic) flashes, the backbone of adiabatic units, valves, compressors, and turbines; a TV flash; bubble and dew points; andstability. The gamma-phi package gets its heat of mixing from autodiff of the excess Gibbs energy (excess_enthalpy,excess_entropy), so enthalpy stays consistent with the activity coefficients. Solve methods run through compiled kernels with the package as a dynamic argument. Importingfugacio.thermoenables 64-bit JAX arithmetic (setFUGACIO_X64=0to opt out). - Activity-coefficient models: Margules, van Laar, Wilson, NRTL, UNIQUAC, and
predictive regular-solution / Flory-Huggins, available both as functions and
as differentiable
ActivityModelobjects (nrtl,uniquac, ...) whose parameters are themselves gradient leaves. - Group contribution: predictive
unifac_activityandjoback_estimate(pure-component constants from a structure). - Molecular PC-SAFT: the perturbed-chain SAFT equation of state
(
SaftParameters,saft_parameters_for,alpha_residual, and theSAFTPackagefromsaft_package) with a curated Gross-Sadowski parameter bank, Wertheim TPT1 association for hydrogen-bonding fluids (2B,3B, and4Cschemes), fugacity / density / residual properties by autodiff, the equilibrium routinesflash_pt_saft,bubble_pressure_saft,dew_pressure_saft, andpsat_saft(each with a_with_infoform), and differentiable parameter regression (fit_saft_pure,fit_saft_kij). - Reference state: pure-liquid reference fugacity (
liquid_reference_fugacity), thepoynting_factor, saturation fugacity coefficient, andhenry_constant. - EOS phase equilibrium:
rachford_rice,flash_pt,psat_eos,bubble_pressure_eos, anddew_pressure_eos, each with a_with_infoform. - Non-ideal (gamma-phi) VLE:
flash_pt_gamma,bubble_pressure_gamma,dew_pressure_gamma, and the temperature duals, the route that captures azeotropes and strongly polar mixtures. - Liquid-liquid & three-phase equilibria: stability-first isoactivity
flash_llewithtie_line/binodal_curve, three-phaseflash_vlle, and the binaryheterogeneous_azeotropesolver. - Phase stability: one shared tangent-plane search,
tpd_search, with liquid and vapor trial branches and multiple starts. Every package exposes it asstability, andliquid_stabilitytests an activity-model liquid for a second liquid. - Physical acceptance (
fugacio.thermo.acceptance):flash_pt_checked,flash_ph_checked, andflash_ps_checkedgrade material balance, equifugacity, stability, and parameter applicability independently of the solver, andPhysicalReport.failures()names each failed criterion. - Parameter regression & prediction: a self-contained
levenberg_marquardtover arbitrary parameter pytrees with residual builders (bubble_pressure_residuals,activity_residuals,lle_residuals), ready fitters (fit_nrtl_binary,fit_uniquac_binary), and UNIFAC-to-binary prediction (predict_nrtl_from_unifac,predict_uniquac_from_unifac) for mixtures without fitted parameters. - Reactions, equilibrium & kinetics: stoichiometry and standard-state
thermochemistry (
Reaction,reaction_properties,delta_g_rxn,equilibrium_constant), chemical-reactionequilibrium(single or simultaneous, ideal-gas or EOS-phibasis), and differentiable rate laws (PowerLaw,MassActionReversible,LHHW,Arrhenius). - Validation harness: first-principles consistency checks (Gibbs-Duhem,
equifugacity, the
(d ln phi / dP)_Tidentity, and the Gibbs-Helmholtz and fugacity-enthalpy consistency of property packages), an AD-vs-finite-difference checker, and optional differential-testing oracles: CoolProp /chemicals(pure-fluid properties),thermo/ Clapeyron.jl (activity coefficients and PC-SAFT), and Cantera (reaction equilibrium and standard-state thermochemistry).
Example: a differentiable flash
import jax
import jax.numpy as jnp
from fugacio.thermo import PR, component_arrays, flash_pt
arr = component_arrays(["methane", "propane", "n-pentane"])
z = jnp.array([0.5, 0.3, 0.2])
result = flash_pt(PR, 320.0, 20e5, z, arr["tc"], arr["pc"], arr["omega"])
result.beta # vapor fraction (~0.75); NaN if the flash had failed
result.x, result.y # liquid / vapor compositions
# Gradient of the vapor fraction w.r.t. pressure, straight through the solver:
dbeta_dP = jax.grad(
lambda p: flash_pt(PR, 320.0, p, z, arr["tc"], arr["pc"], arr["omega"]).beta
)
dbeta_dP(20e5)
Example: a non-ideal (gamma-phi) bubble point
import jax.numpy as jnp
from fugacio.thermo import bubble_pressure_gamma, component_arrays, nrtl
arr = component_arrays(["ethanol", "water"])
# NRTL with 1/T interaction coefficients (K); alpha = 0.3.
model = nrtl(
a=jnp.zeros((2, 2)),
b=jnp.array([[0.0, 670.0], [310.0, 0.0]]),
alpha=jnp.array([[0.0, 0.3], [0.3, 0.0]]),
)
P, y = bubble_pressure_gamma(model, 350.0, jnp.array([0.3, 0.7]),
arr["tc"], arr["pc"], arr["omega"])
# P, y are differentiable w.r.t. T, x, *and* the NRTL parameters.
Part of the fugacio namespace; installs independently:
pip install fugacio-thermo.
Metadata
Release files for fugacio-thermo 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| fugacio_thermo-0.10.0.tar.gz | 428.0 kB | Without provenance | Details for fugacio_thermo-0.10.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fugacio_thermo-0.10.0-py3-none-any.whl | Python 3 | none | any | Details for fugacio_thermo-0.10.0-py3-none-any.whl |
Total release size: 844.8 kB
Release files / fugacio_thermo-0.10.0.tar.gz
| Download URL | fugacio_thermo-0.10.0.tar.gz |
|---|---|
| Size | 428.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ff5877eb41f3a1882fd4f977318ab7b66af243337d7568500100609db044c73f
|
|
BLAKE2b-256 checksum How to use checksums |
7d8f5708d228f3b2d288f0016616dbf259e6fad3afad6d3d18b954de63637458
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / fugacio_thermo-0.10.0-py3-none-any.whl
| Download URL | fugacio_thermo-0.10.0-py3-none-any.whl |
|---|---|
| Size | 416.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
158281f4e4c995c049dc0aa6d7198f3e27f5043cffc557a722346ab175b5ca5b
|
|
BLAKE2b-256 checksum How to use checksums |
50ceee507f137265e811f0116eb9cbf5e9eb98acaaacdecb903b1afe149a0192
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for fugacio-thermo 0.10.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.