Skip to content

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, and site_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

SAFTModel: PC-SAFT behind the unified EquilibriumModel interface.

parameters

The differentiable PC-SAFT parameter set and its combining rules.

pcsaft

The PC-SAFT reduced residual Helmholtz energy alpha_res(rho, T, x).

properties

PC-SAFT properties at (rho, T, x) and (T, P, x) from alpha_res.

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 (T, P) relative to the ideal gas.

Functions:

Name Description
alpha_association

Association contribution alpha_assoc to the reduced residual Helmholtz energy.

association_strength

Association strength matrix Delta_ij (m^3) for every component pair.

site_fractions

Bonded-site fractions (X_A, X_B) per component at (rho, T, x).

bubble_pressure_saft

Bubble-point pressure and incipient vapour (P, y) at fixed T, x.

dew_pressure_saft

Dew-point pressure and incipient liquid (P, x) at fixed T, y.

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 p_guess.

stability_saft

Michelsen tangent-plane stability test for feed z at (T, P) on PC-SAFT.

saft_model

Construct a SAFTModel from a PC-SAFT parameter set and seeding constants.

saft_parameters

Assemble a SaftParameters pytree from raw parameter arrays.

saft_parameters_for

Build a SaftParameters set for named components from the curated bank.

segment_diameter

Temperature-dependent segment diameter d_i(T) (metres).

alpha_dispersion

Dispersion contribution alpha_disp (Gross-Sadowski eqs. 16-19).

alpha_hard_chain

Hard-chain contribution alpha_hc to the reduced residual Helmholtz energy.

alpha_residual

Total PC-SAFT reduced residual Helmholtz energy A_res / (n R T).

compressibility_factor

Compressibility factor Z = 1 + rho (d alpha_res / d rho) at (rho, T, x).

ln_fugacity_coefficients

Log fugacity coefficients ln phi_i of every component at (T, P, x).

molar_density

Molar density rho(T, P, x) (mol/m^3) on the requested phase branch.

pressure

Pressure (Pa) at molar density rho (mol/m^3), temperature t (K), comp. x.

residual_properties

All residual molar properties at (T, P, x) on a phase branch.

fit_saft_kij

Fit a single binary correction k_ij to isothermal bubble-pressure data.

fit_saft_pure

Fit pure (m, sigma, epsilon) to saturation pressure and liquid density.

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 T, x.

dew_pressure

Dew pressure and incipient liquid at fixed T, y.

bubble_temperature

Bubble temperature and incipient vapour at fixed P, x.

dew_temperature

Dew temperature and incipient liquid at fixed P, y.

stability

Michelsen tangent-plane stability of feed z at (T, P).

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 (n,) (dimensionless).

sigma Array

Segment diameter per component, shape (n,) (metres).

epsilon Array

Dispersion energy epsilon/k per component, (n,) (kelvin).

kappa_ab Array

Association volume per component, (n,) (0 if non-associating).

epsilon_ab Array

Association energy epsilon_AB/k per component, (n,) (kelvin).

n_sites_a Array

Number of type-A (electron-acceptor) sites per component, (n,).

n_sites_b Array

Number of type-B (electron-donor) sites per component, (n,).

kij Array

Symmetric binary dispersion correction, shape (n, n) (zero diagonal).

associating bool

Whether any A-B association is active in the mixture (static).

names tuple[str, ...] | None

Optional component labels (static), for diagnostics.

n_components property

n_components: int

Number of components in the parameter set.

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 H - H^ig (J/mol).

entropy Array

Residual molar entropy S - S^ig (J/mol/K).

gibbs Array

Residual molar Gibbs energy G - G^ig (J/mol).

cp Array

Residual molar isobaric heat capacity cp - cp^ig (J/mol/K).

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 (n,).

required

Returns:

Type Description
Array

The symmetric (n, n) association-strength matrix.

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 (n,).

required

Returns:

Type Description
Array

(X_A, X_B): the fraction of type-A and type-B sites not bonded, each

Array

shape (n,). Differentiable with respect to state and parameters.

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 ln phi^L - ln phi^V.

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 (n,).

required
sigma Array

Segment diameter per component, (n,) (metres, unless sigma_in_angstrom).

required
epsilon Array

Dispersion energy epsilon/k per component, (n,) (kelvin).

required
kappa_ab Array | None

Association volume per component (None => no association).

None
epsilon_ab Array | None

Association energy epsilon_AB/k per component (kelvin).

None
n_sites_a Array | None

Type-A site count per component (None => zeros).

None
n_sites_b Array | None

Type-B site count per component (None => zeros).

None
kij Array | None

Symmetric (n, n) binary correction (None => zeros).

None
names Sequence[str] | None

Optional component labels.

None
sigma_in_angstrom bool

If True, sigma is given in angstrom and is converted to metres.

False

Returns:

Type Description
SaftParameters

A registered SaftParameters pytree.

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 (fugacio.thermo.saft._data.PURE_SAFT_PARAMS).

required
kij Array | None

Explicit (n, n) binary-correction matrix; takes precedence over the curated bank.

None
use_database_kij bool

Fill the binary corrections from the curated fugacio.thermo.saft._data.SAFT_KIJ set when kij is not given; pairs without a curated value stay at zero.

True

Returns:

Type Description
SaftParameters

The assembled SaftParameters pytree.

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 (n,).

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 (n,).

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 (n,).

required
phase str

Density branch (see molar_density).

'liquid'

Returns:

Type Description
Array

The vector of ln phi_i, differentiable in (T, P, x) and the

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 (n,).

required
phase str

"liquid" or "vapor" seed the Newton solve from a dense packing fraction or the ideal gas; "stable" runs a bracketed bisection over the whole density range and returns the root with the lower molar Gibbs energy when more than one branch exists.

'liquid'

Returns:

Type Description
Array

The converged molar density, differentiable in T, P, x, and

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 (n,).

required
phase str

Density branch (see molar_density).

'liquid'

Returns:

Type Description
ResidualProperties

A ResidualProperties of Z and the enthalpy/entropy/Gibbs/cp

ResidualProperties

departures, each differentiable in (T, P, x) and the parameters.

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 kij is overwritten by the fit).

required
t ArrayLike

Temperature of the isotherm (K).

required
x Array

Liquid mole fractions of component 0 at each point, shape (k,); the second component is 1 - x.

required
p_exp Array

Measured bubble pressures (Pa), shape (k,).

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]

(kij, cost): the fitted scalar binary correction and the final cost.

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 (k,).

required
psat_exp Array

Experimental saturation pressures (Pa), shape (k,).

required
rho_liquid_exp Array

Experimental saturated-liquid molar densities (mol/m^3), shape (k,).

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

(params, cost): the fitted single-component SaftParameters and the

Array

final half-sum-of-squares cost.