PC-SAFT (molecular SAFT)¶
The perturbed-chain statistical associating fluid theory (PC-SAFT) of Gross and
Sadowski, implemented as one scalar reduced residual Helmholtz energy whose every
property, the density and saturation solvers, and the Wertheim association
site-fraction solve are exact jax.grad derivatives, differentiable in both state
and the molecular parameters themselves. SAFTModel exposes the same
flash_pt, bubble, and dew calls as a cubic EOSModel or a GammaPhiModel, so a
flowsheet adopts a molecular EOS by swapping one object.
See the molecular SAFT guide for worked examples.
saft
¶
PC-SAFT: a molecular-based, differentiable equation of state.
The perturbed-chain statistical associating fluid theory (PC-SAFT) of Gross &
Sadowski is the third major class of thermodynamic method in Fugacio, alongside
the cubic equations of state (fugacio.thermo.eos) and the gamma-phi activity
models (fugacio.thermo.gammaphi). It models a fluid as chains of spherical
segments with dispersion attraction and optional short-range association, which
captures associating species (water, alcohols, amines), polymers, and refrigerant
mixtures far better than a cubic EOS.
As with the reference multiparameter EOS (fugacio.thermo.helmholtz), PC-SAFT
is one scalar reduced Helmholtz energy
(fugacio.thermo.saft.pcsaft.alpha_residual) and every property is an autodiff
derivative of it, so the whole model, including the Wertheim association
site-fraction solve, is differentiable in both state and parameters.
The public surface is:
- parameters:
SaftParameters,saft_parameters,saft_parameters_for(named components from the curated bank); - energy & properties:
alpha_residual,compressibility_factor,pressure,molar_density,ln_fugacity_coefficients,residual_properties, andsite_fractions; - phase equilibrium:
flash_pt_saft,bubble_pressure_saft,dew_pressure_saft,psat_saft,stability_saft; - model: the unified
SAFTModel/saft_model; - regression:
fit_saft_pure,fit_saft_kij.
Modules:
| Name | Description |
|---|---|
association |
Wertheim (TPT1) association for PC-SAFT, with a differentiable site solve. |
equilibrium |
PC-SAFT phase equilibrium: flash, bubble/dew points, saturation, stability. |
model |
|
parameters |
The differentiable PC-SAFT parameter set and its combining rules. |
pcsaft |
The PC-SAFT reduced residual Helmholtz energy |
properties |
PC-SAFT properties at |
regression |
Differentiable PC-SAFT parameter estimation. |
Classes:
| Name | Description |
|---|---|
SAFTModel |
PC-SAFT (phi-phi) equilibrium model. |
SaftParameters |
PC-SAFT parameters of a mixture as a differentiable pytree. |
ResidualProperties |
Residual (departure) molar properties at |
Functions:
| Name | Description |
|---|---|
alpha_association |
Association contribution |
association_strength |
Association strength matrix |
site_fractions |
Bonded-site fractions |
bubble_pressure_saft |
Bubble-point pressure and incipient vapour |
dew_pressure_saft |
Dew-point pressure and incipient liquid |
flash_pt_saft |
Isothermal-isobaric two-phase flash on PC-SAFT by accelerated substitution. |
psat_saft |
Pure-component saturation pressure (Pa) by equifugacity, from a guess |
stability_saft |
Michelsen tangent-plane stability test for feed |
saft_model |
Construct a |
saft_parameters |
Assemble a |
saft_parameters_for |
Build a |
segment_diameter |
Temperature-dependent segment diameter |
alpha_dispersion |
Dispersion contribution |
alpha_hard_chain |
Hard-chain contribution |
alpha_residual |
Total PC-SAFT reduced residual Helmholtz energy |
compressibility_factor |
Compressibility factor |
ln_fugacity_coefficients |
Log fugacity coefficients |
molar_density |
Molar density |
pressure |
Pressure (Pa) at molar density |
residual_properties |
All residual molar properties at |
fit_saft_kij |
Fit a single binary correction |
fit_saft_pure |
Fit pure |
SAFTModel
dataclass
¶
SAFTModel(
params: SaftParameters,
tc: Array,
pc: Array,
omega: Array,
)
PC-SAFT (phi-phi) equilibrium model.
Attributes:
| Name | Type | Description |
|---|---|---|
params |
SaftParameters
|
PC-SAFT parameter set (a differentiable pytree). |
tc, |
(pc, omega)
|
Component critical constants and acentric factors, used to seed the Wilson K-values that initialise the flashes. |
Methods:
| Name | Description |
|---|---|
flash_pt |
Isothermal-isobaric two-phase flash via PC-SAFT. |
bubble_pressure |
Bubble pressure and incipient vapour at fixed |
dew_pressure |
Dew pressure and incipient liquid at fixed |
bubble_temperature |
Bubble temperature and incipient vapour at fixed |
dew_temperature |
Dew temperature and incipient liquid at fixed |
stability |
Michelsen tangent-plane stability of feed |
flash_pt
¶
flash_pt(
t: ArrayLike, p: ArrayLike, z: Array
) -> FlashResult
Isothermal-isobaric two-phase flash via PC-SAFT.
bubble_pressure
¶
bubble_pressure(
t: ArrayLike, x: Array
) -> tuple[Array, Array]
Bubble pressure and incipient vapour at fixed T, x.
dew_pressure
¶
dew_pressure(t: ArrayLike, y: Array) -> tuple[Array, Array]
Dew pressure and incipient liquid at fixed T, y.
bubble_temperature
¶
bubble_temperature(
p: ArrayLike,
x: Array,
*,
t_min: float = 150.0,
t_max: float = 700.0,
) -> tuple[Array, Array]
Bubble temperature and incipient vapour at fixed P, x.
Found by inverting bubble_pressure for the temperature whose bubble
pressure equals P (saturation pressure rises monotonically with
temperature), then returning the incipient vapour there.
dew_temperature
¶
dew_temperature(
p: ArrayLike,
y: Array,
*,
t_min: float = 150.0,
t_max: float = 700.0,
) -> tuple[Array, Array]
Dew temperature and incipient liquid at fixed P, y.
stability
¶
stability(
t: ArrayLike, p: ArrayLike, z: Array
) -> StabilityResult
Michelsen tangent-plane stability of feed z at (T, P).
SaftParameters
dataclass
¶
SaftParameters(
m: Array,
sigma: Array,
epsilon: Array,
kappa_ab: Array,
epsilon_ab: Array,
n_sites_a: Array,
n_sites_b: Array,
kij: Array,
associating: bool,
names: tuple[str, ...] | None,
)
PC-SAFT parameters of a mixture as a differentiable pytree.
Attributes:
| Name | Type | Description |
|---|---|---|
m |
Array
|
Segment number per component, shape |
sigma |
Array
|
Segment diameter per component, shape |
epsilon |
Array
|
Dispersion energy |
kappa_ab |
Array
|
Association volume per component, |
epsilon_ab |
Array
|
Association energy |
n_sites_a |
Array
|
Number of type-A (electron-acceptor) sites per component, |
n_sites_b |
Array
|
Number of type-B (electron-donor) sites per component, |
kij |
Array
|
Symmetric binary dispersion correction, shape |
associating |
bool
|
Whether any A-B association is active in the mixture (static). |
names |
tuple[str, ...] | None
|
Optional component labels (static), for diagnostics. |
ResidualProperties
¶
Bases: NamedTuple
Residual (departure) molar properties at (T, P) relative to the ideal gas.
Attributes:
| Name | Type | Description |
|---|---|---|
z |
Array
|
Compressibility factor. |
enthalpy |
Array
|
Residual molar enthalpy |
entropy |
Array
|
Residual molar entropy |
gibbs |
Array
|
Residual molar Gibbs energy |
cp |
Array
|
Residual molar isobaric heat capacity |
alpha_association
¶
alpha_association(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Association contribution alpha_assoc to the reduced residual Helmholtz energy.
sum_i x_i [ n_{A,i}(ln X_{A,i} - X_{A,i}/2) + n_{B,i}(ln X_{B,i} - X_{B,i}/2)
+ (n_{A,i} + n_{B,i}) / 2 ] (Chapman-Gubbins-Jackson-Radosz).
association_strength
¶
association_strength(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Association strength matrix Delta_ij (m^3) for every component pair.
Delta_ij = g_ij^hs sigma_ij^3 kappa_ij [exp(epsilon_ij^AB / T) - 1] with the
contact radial distribution at the mixture packing fraction and the CR-1
combining rules for the unlike association parameters.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
rho
|
ArrayLike
|
Molar density (mol/m^3). |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
x
|
Array
|
Mole fractions, shape |
required |
Returns:
| Type | Description |
|---|---|
Array
|
The symmetric |
site_fractions
¶
site_fractions(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> tuple[Array, Array]
Bonded-site fractions (X_A, X_B) per component at (rho, T, x).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
rho
|
ArrayLike
|
Molar density (mol/m^3). |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
x
|
Array
|
Mole fractions, shape |
required |
Returns:
| Type | Description |
|---|---|
Array
|
|
Array
|
shape |
bubble_pressure_saft
¶
bubble_pressure_saft(
params: SaftParameters,
t: ArrayLike,
x: Array,
tc: Array,
pc: Array,
omega: Array,
*,
tol: float = 1e-12,
max_iter: int = 300,
) -> tuple[Array, Array]
Bubble-point pressure and incipient vapour (P, y) at fixed T, x.
Solved as a coupled fixed point in (ln P, y) so the result is
differentiable in temperature, composition, and the PC-SAFT parameters.
dew_pressure_saft
¶
dew_pressure_saft(
params: SaftParameters,
t: ArrayLike,
y: Array,
tc: Array,
pc: Array,
omega: Array,
*,
tol: float = 1e-12,
max_iter: int = 300,
) -> tuple[Array, Array]
Dew-point pressure and incipient liquid (P, x) at fixed T, y.
Differentiable in temperature, composition, and the PC-SAFT parameters.
flash_pt_saft
¶
flash_pt_saft(
params: SaftParameters,
t: ArrayLike,
p: ArrayLike,
z: Array,
tc: Array,
pc: Array,
omega: Array,
*,
tol: float = 1e-12,
max_iter: int = 300,
) -> FlashResult
Isothermal-isobaric two-phase flash on PC-SAFT by accelerated substitution.
Solves the equal-fugacity conditions phi_i^L x_i = phi_i^V y_i with the
Rachford-Rice material balance, seeded from Wilson K-values. The converged
(beta, x, y) is differentiable in (T, P, z) and the PC-SAFT
parameters through implicit differentiation of the fixed point.
psat_saft
¶
psat_saft(
params: SaftParameters,
t: ArrayLike,
p_guess: ArrayLike,
*,
tol: float = 1e-11,
max_iter: int = 100,
) -> Array
Pure-component saturation pressure (Pa) by equifugacity, from a guess p_guess.
Solves ln phi^L(T, P) = ln phi^V(T, P) for P with a Newton iteration in
ln P (keeping the pressure positive). params must hold a single
component. Differentiable in T and the PC-SAFT parameters through the
Clapeyron-like implicit derivative.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
Single-component PC-SAFT parameter set. |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
p_guess
|
ArrayLike
|
Initial pressure estimate (Pa); a Wilson/Antoine value is fine. |
required |
tol
|
float
|
Residual tolerance on |
1e-11
|
max_iter
|
int
|
Newton iteration cap. |
100
|
Returns:
| Type | Description |
|---|---|
Array
|
The saturation pressure (Pa). |
stability_saft
¶
stability_saft(
params: SaftParameters,
t: ArrayLike,
p: ArrayLike,
z: Array,
tc: Array,
pc: Array,
omega: Array,
*,
iters: int = 40,
) -> StabilityResult
Michelsen tangent-plane stability test for feed z at (T, P) on PC-SAFT.
Runs vapour-like and liquid-like trial-phase searches; a modified tangent-plane distance below zero for either means the feed splits.
saft_model
¶
saft_model(
params: SaftParameters,
tc: Array,
pc: Array,
omega: Array,
) -> SAFTModel
Construct a SAFTModel from a PC-SAFT parameter set and seeding constants.
saft_parameters
¶
saft_parameters(
m: Array,
sigma: Array,
epsilon: Array,
*,
kappa_ab: Array | None = None,
epsilon_ab: Array | None = None,
n_sites_a: Array | None = None,
n_sites_b: Array | None = None,
kij: Array | None = None,
names: Sequence[str] | None = None,
sigma_in_angstrom: bool = False,
) -> SaftParameters
Assemble a SaftParameters pytree from raw parameter arrays.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
m
|
Array
|
Segment number per component, shape |
required |
sigma
|
Array
|
Segment diameter per component, |
required |
epsilon
|
Array
|
Dispersion energy |
required |
kappa_ab
|
Array | None
|
Association volume per component ( |
None
|
epsilon_ab
|
Array | None
|
Association energy |
None
|
n_sites_a
|
Array | None
|
Type-A site count per component ( |
None
|
n_sites_b
|
Array | None
|
Type-B site count per component ( |
None
|
kij
|
Array | None
|
Symmetric |
None
|
names
|
Sequence[str] | None
|
Optional component labels. |
None
|
sigma_in_angstrom
|
bool
|
If |
False
|
Returns:
| Type | Description |
|---|---|
SaftParameters
|
A registered |
saft_parameters_for
¶
saft_parameters_for(
components: Sequence[str],
*,
kij: Array | None = None,
use_database_kij: bool = True,
) -> SaftParameters
Build a SaftParameters set for named components from the curated bank.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
components
|
Sequence[str]
|
Component names present in the PC-SAFT parameter bank
( |
required |
kij
|
Array | None
|
Explicit |
None
|
use_database_kij
|
bool
|
Fill the binary corrections from the curated
|
True
|
Returns:
| Type | Description |
|---|---|
SaftParameters
|
The assembled |
Raises:
| Type | Description |
|---|---|
KeyError
|
If any component lacks curated PC-SAFT parameters. |
segment_diameter
¶
segment_diameter(
params: SaftParameters, t: ArrayLike
) -> Array
Temperature-dependent segment diameter d_i(T) (metres).
The Chen-Kreglewski soft-repulsion diameter
d_i = sigma_i [1 - 0.12 exp(-3 epsilon_i / (k T))] used by PC-SAFT.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
Returns:
| Type | Description |
|---|---|
Array
|
The per-component effective hard-sphere diameter, shape |
alpha_dispersion
¶
alpha_dispersion(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Dispersion contribution alpha_disp (Gross-Sadowski eqs. 16-19).
alpha_hard_chain
¶
alpha_hard_chain(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Hard-chain contribution alpha_hc to the reduced residual Helmholtz energy.
The BMCSL hard-sphere reference scaled by the mean segment number, less the
chain term sum_i x_i (m_i - 1) ln g_ii^hs (Gross-Sadowski eqs. 5-8).
alpha_residual
¶
alpha_residual(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Total PC-SAFT reduced residual Helmholtz energy A_res / (n R T).
The sum of the hard-chain, dispersion, and (where active) association
contributions, evaluated at molar density rho (mol/m^3), temperature
t (K), and mole fractions x.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
rho
|
ArrayLike
|
Molar density (mol/m^3). |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
x
|
Array
|
Mole fractions, shape |
required |
Returns:
| Type | Description |
|---|---|
Array
|
The dimensionless residual Helmholtz energy; every PC-SAFT property is an |
Array
|
autodiff derivative of this scalar. |
compressibility_factor
¶
compressibility_factor(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Compressibility factor Z = 1 + rho (d alpha_res / d rho) at (rho, T, x).
ln_fugacity_coefficients
¶
ln_fugacity_coefficients(
params: SaftParameters,
t: ArrayLike,
p: ArrayLike,
x: Array,
*,
phase: str = "liquid",
) -> Array
Log fugacity coefficients ln phi_i of every component at (T, P, x).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
p
|
ArrayLike
|
Pressure (Pa). |
required |
x
|
Array
|
Mole fractions, shape |
required |
phase
|
str
|
Density branch (see |
'liquid'
|
Returns:
| Type | Description |
|---|---|
Array
|
The vector of |
Array
|
PC-SAFT parameters. |
molar_density
¶
molar_density(
params: SaftParameters,
t: ArrayLike,
p: ArrayLike,
x: Array,
*,
phase: str = "liquid",
) -> Array
Molar density rho(T, P, x) (mol/m^3) on the requested phase branch.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
p
|
ArrayLike
|
Pressure (Pa). |
required |
x
|
Array
|
Mole fractions, shape |
required |
phase
|
str
|
|
'liquid'
|
Returns:
| Type | Description |
|---|---|
Array
|
The converged molar density, differentiable in |
Array
|
the PC-SAFT parameters. |
pressure
¶
pressure(
params: SaftParameters,
rho: ArrayLike,
t: ArrayLike,
x: Array,
) -> Array
Pressure (Pa) at molar density rho (mol/m^3), temperature t (K), comp. x.
residual_properties
¶
residual_properties(
params: SaftParameters,
t: ArrayLike,
p: ArrayLike,
x: Array,
*,
phase: str = "liquid",
) -> ResidualProperties
All residual molar properties at (T, P, x) on a phase branch.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
params
|
SaftParameters
|
PC-SAFT parameter set. |
required |
t
|
ArrayLike
|
Temperature (K). |
required |
p
|
ArrayLike
|
Pressure (Pa). |
required |
x
|
Array
|
Mole fractions, shape |
required |
phase
|
str
|
Density branch (see |
'liquid'
|
Returns:
| Type | Description |
|---|---|
ResidualProperties
|
A |
ResidualProperties
|
departures, each differentiable in |
fit_saft_kij
¶
fit_saft_kij(
base: SaftParameters,
t: ArrayLike,
x: Array,
p_exp: Array,
tc: Array,
pc: Array,
omega: Array,
*,
max_iter: int = 40,
) -> tuple[Array, Array]
Fit a single binary correction k_ij to isothermal bubble-pressure data.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
base
|
SaftParameters
|
Binary PC-SAFT parameter set (its |
required |
t
|
ArrayLike
|
Temperature of the isotherm (K). |
required |
x
|
Array
|
Liquid mole fractions of component 0 at each point, shape |
required |
p_exp
|
Array
|
Measured bubble pressures (Pa), shape |
required |
tc
|
Array
|
Critical temperatures of the two components, K (for Wilson seeding). |
required |
pc
|
Array
|
Critical pressures of the two components, Pa (for Wilson seeding). |
required |
omega
|
Array
|
Acentric factors of the two components (for Wilson seeding). |
required |
max_iter
|
int
|
Levenberg-Marquardt iteration cap. |
40
|
Returns:
| Type | Description |
|---|---|
tuple[Array, Array]
|
|
fit_saft_pure
¶
fit_saft_pure(
base: SaftParameters,
t: Array,
psat_exp: Array,
rho_liquid_exp: Array,
*,
density_weight: float = 1.0,
max_iter: int = 60,
) -> tuple[SaftParameters, Array]
Fit pure (m, sigma, epsilon) to saturation pressure and liquid density.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
base
|
SaftParameters
|
Single-component PC-SAFT parameter set; its current values seed the fit and any association parameters are held fixed. |
required |
t
|
Array
|
Temperatures of the data points (K), shape |
required |
psat_exp
|
Array
|
Experimental saturation pressures (Pa), shape |
required |
rho_liquid_exp
|
Array
|
Experimental saturated-liquid molar densities (mol/m^3),
shape |
required |
density_weight
|
float
|
Relative weight of the density residuals against the pressure residuals. |
1.0
|
max_iter
|
int
|
Levenberg-Marquardt iteration cap. |
60
|
Returns:
| Type | Description |
|---|---|
SaftParameters
|
|
Array
|
final half-sum-of-squares cost. |