Enthalpy of sorption

Methods for determining isosteric enthalpy of adsorption.

Clausius-Clapeyron Method

Module calculating the isosteric enthalpy for isotherms at different temperatures.

pygaps.characterisation.enth_sorp_clapeyron.enthalpy_sorption_clapeyron(isotherms: list[PointIsotherm | ModelIsotherm], loading_points: list = None, branch: str = 'ads', verbose: bool = False)[source]

Calculate the isosteric enthalpy of adsorption (in kJ/mol) by applying the Clausius-Clapeyron equation to several isotherms recorded at different temperatures on the same material.

Parameters:
  • isotherms (list[PointIsotherms | ModelIsotherm]) -- The isotherms to use in calculation of the isosteric enthalpy. They should all be measured on the same material.

  • loading_points (list[float], optional) -- The loading points at which the isosteric enthalpy should be calculated. Default will be 50 equally spaced points in the available range. The points must be within the range of loading of all passed isotherms, or else the calculation cannot complete.

  • branch (str) -- The branch of the isotherms to take, defaults to adsorption branch.

  • verbose (bool) -- Whether to print out extra information and generate a graph.

Returns:

result_dict (dict) -- A dictionary with the isosteric enthalpies per loading, with the form:

  • isosteric_enthalpy (array) : the isosteric enthalpy of adsorption in kJ/mol

  • loading (array) : the loading for each point of the isosteric enthalpy, in mmol

  • slopes (array) : the exact log(p) vs 1/T slope for each point

  • correlation (array) : correlation coefficient for each point

  • std_errors (array) : estimated standard errors for each point

Raises:

ParameterError -- When something is wrong with the function parameters.

Notes

Description

The isosteric enthalpies are calculated from experimental data using the Clausius-Clapeyron equation as the starting point:

\[\Big( \frac{\partial \ln P}{\partial T} \Big)_{n_a} = -\frac{\Delta H_{ads}}{R T^2}\]

Where \(\Delta H_{ads}\) is the enthalpy of adsorption. In order to approximate the partial differential, two or more isotherms are measured at different temperatures. The assumption made is that the enthalpy of adsorption does not vary in the temperature range chosen. Therefore, the isosteric enthalpy of adsorption can be calculated by using the pressures at which the loading is identical using the following equation for each point:

\[\Delta H_{ads} = - R \frac{\partial \ln P}{\partial 1 / T}\]

and plotting the values of \(\ln P\) against \(1 / T\) we should obtain a straight line with a slope of \(- \Delta H_{ads} / R.\)

Limitations

The isosteric enthalpy is sensitive to the differences in pressure between the two isotherms. If the isotherms measured are too close together, the error margin will increase.

The method also assumes that enthalpy of adsorption does not vary with temperature. If the variation is large for the system in question, the isosteric enthalpy calculation will give unrealistic values.

Even with carefully measured experimental data, there are two assumptions used in deriving the Clausius-Clapeyron equation: an ideal bulk gas phase and a negligible adsorbed phase molar volume. These have a significant effect on the calculated isosteric enthalpies of adsorption, especially at high relative pressures and for heavy adsorbates.

See also

pygaps.characterisation.enthalpy_sorption_clausclap.isosteric_enthalpy_raw

low level method

pygaps.characterisation.enth_sorp_clapeyron.isosteric_enthalpy_raw(pressures: list, temperatures: list)[source]

Calculate the isosteric enthalpy of adsorption using several isotherms recorded at different temperatures on the same material.

This is a 'bare-bones' function to calculate isosteric enthalpy which is designed as a low-level alternative to the main function. Designed for advanced use, its parameters have to be manually specified.

Parameters:
  • pressure (array of arrays) -- A two dimensional array of pressures for each isotherm at same loading point, in bar. For example, if using two isotherms to calculate the isosteric enthalpy:

    [
        [p1_iso1, p1_iso2],
        [p2_iso1, p2_iso2],
        [p3_iso1, p3_iso2],
        ...
    ]
    
  • temperatures (array) -- Temperatures of the isotherms are taken, Kelvin.

Returns:

  • iso_enth (array) -- Calculated isosteric enthalpy.

  • slopes (array) -- Slopes fitted for each point.

  • correlations (array) -- The correlation of the straight line of each fit.

Whittaker Method

Module implementing the Whittaker method for isosteric enthalpy calculations.

pygaps.characterisation.enth_sorp_whittaker.enthalpy_sorption_whittaker(isotherm: BaseIsotherm, branch: str = 'ads', model: str = 'Toth', loading: list | None = None, verbose: bool = False, **kwargs)[source]

Calculate the isosteric heat of adsorption, Delta H_{st} using a single isotherm via the Whittaker method. Pass either a ModelIsotherm of a suitable model (Toth or Langmuir) or the model itself. Parameters of the model fit are then used to determine \(\Delta H_{st}\).

Parameters:
  • isotherm (BaseIsotherm) -- The PointIsotherm or ModelIsotherm to be used. If ModelIsotherm, units must be in Pascal

  • model (str) -- The model to use to fit the PointIsotherm, must be either one of _WHITTAKER_MODELS.

  • loading (list[float]) -- The loadings for which to calculate the isosteric heat of adsorption.

  • verbose (bool) -- Whether to print out extra information and generate a graph.

Returns:

result_dict (dict) -- A dictionary with the isosteric enthalpies per loading, with the form:

  • enthalpy_sorption (array) : the isosteric enthalpy of adsorption in kJ/mol

  • loading (array) : the loading for each point of the isosteric enthalpy, in mmol/g

  • model_isotherm (ModelIsotherm): the model isotherm used to calculate the enthalpies.

Raises:

ParameterError -- When incorrect type of model isotherm is used.

Notes

The Whittaker method, [1] sometimes known as a modified Tóth potential uses variables derived from fitting of a Toth-like model isotherm to derive the isosteric enthalpy of adsorption \(\Delta H_{st}\). Toth-like isotherms take the general form;

n(P) = sum_{i} n_{m_i} frac{K_i P}{sqrt[t_i]{1+(K_i P)^{t_i}}}

And apart from Toth, include the multi- and single site Langmuir model (where all t_i are 1), and the chemiphysisorption model.

The general form of the Whittaker potential is;

\[\Delta H_{st} = \Delta \lambda + \Delta H_{vap} + RT\]

Where \(\Delta \lambda\) is the adsorption potential, and \(\Delta H_{vap}\) is the latent heat of the liquid-vapour change at equilibrium pressure.

For loadings below the triple point pressure, \(\Delta H_{vap}\) is meaningless. In this case, \(\Delta H_{vap}\) is estimated as that at the triple point.

\(\Delta \lambda\) is determined from the model isotherm parameters as :

\[\Delta \lambda = R T \sum_{i} \ln{\left[ P_o K_i \left( \frac{\theta_i^{t_i}} {1 - \theta_i^{t_i}} \right )^{\frac{1-t_i}{t_i}} \right ]}\]

Where \(P_0\) is the saturation pressure, \(\theta\) is the fractional coverage, and \(K\) is the equilibrium constant. In the case that the adsorptive is supercritical, the Dubinin pseudo-saturation pressure is used;

..math::

p^0 = p_c left(frac{T}{T_c}right)^2.

The exponent \(t\) is not relevant for Langmuir models it reduces to 1. Thus, \(\Delta \lambda\) becomes

\[\Delta \lambda = RT \sum_{i} \ln{ \left( \frac{P_0}{K_i} \right) }\]

As such, the Whittaker method predicts constant isosteric enthalpies of adsorption when Langmuir models are used.

References

pygaps.characterisation.enth_sorp_whittaker.copy_convert_isotherm(isotherm: PointIsotherm)[source]

Makes a copy of the isotherm, but with pressure converted to absolute mode and units in Pa, and temperature converted to K. For use in enthalpy_sorption_whittaker, so as not to modify the original input.

Parameters:

isotherm (PointIsotherm) -- The isotherm to convert

Returns:

converted isotherm (PointIsotherm) -- New isotherm with all parameters the same as isotherm except with pressure converted to absolute and Pa, and temperature converted to K.

pygaps.characterisation.enth_sorp_whittaker.pressure_at(isotherm: BaseIsotherm, n: float)[source]

Wrapper for isotherm.pressure_at() which returns NAN on a CalculationError.

Parameters:
  • isotherm (BaseIsotherm) -- isotherm to use

  • n (float) -- Loading from which to derive pressure

Returns:

  • pressure at n if possible

  • or np.nan if not.

pygaps.characterisation.enth_sorp_whittaker.vaporisation_enthalpy(adsorbate: Adsorbate, pressure: float, p_c: float, p_sat: float)[source]

Wrapper for adsorbate.enthalpy_vaporisation() which returns NAN if it is impossible to calculate vaporisation enthalpy.

Parameters:
  • adsorbate (Adsorbate,) -- Adsorbate for which to determine the vaporisiation enthalpy

  • pressure (float,) -- Pressure, in Pa at which to determine vaporisation enthalpy

  • p_c (float,) -- Critical pressure of the adsorbate, in Pa.

  • p_sat (float,) -- Saturation pressure of the adsorbate at the isotherm temperature.

Returns:

adsorbate.enthalpy_vaporisation() in J/mol if possible, np.nan if not

pygaps.characterisation.enth_sorp_whittaker.compressibility(adsorbate: Adsorbate, pressure: float, temperature: float, p_c: float, p_sat: float)[source]

Wrapper for adsorbate.compressibility() which returns NAN on a if it is impossible to calculate compressibility.

Parameters:
  • adsorbate (Adsorbate,) -- Adsorbate for which to determine the compressibility.

  • pressure (float,) -- Pressure, in Pa at which to determine compressibility.

  • temperature (float,) -- Isotherm temperature in K.

  • p_c (float,) -- Critical pressure of the adsorbate, in Pa.

  • p_sat (float,) -- Saturation pressure of the adsorbate at the isotherm temperature.

Returns:

adsorbate.compressibility() if possible, np.nan if not

pygaps.characterisation.enth_sorp_whittaker.stderr_estimate(n_terms: int, rmse: float, enthalpy: list[float])[source]

An estimation of the standard error of the isosteric enthalpy of adsorption calculation, based on the RMSE of the model fitting and the number of terms in the model.

..math::

sigma = 0.434 * sqrt{n cdot RMSE^2}

Parameters:
  • n_terms (int,) -- Number of terms in the model used to fit the isotherm

  • rmse (float,) -- root mean square error of model fit

  • enthalpy (list[float],) -- Isosteric enthalpy of adsorption

Returns:

An estimate of standard error for each enthalpy, as a list[float]

pygaps.characterisation.enth_sorp_whittaker.toth_adsorption_potential(model_isotherm: ModelIsotherm, pressure: float, p_sat: float, RT: float)[source]

Calculates the T'oth-corrected Polanyi adsorption potential, $varepsilon_{ads}$ ..math:

\Psi = RT \ln{\Psi \frac{P_{sat}}{P}}
Parameters:
  • model_isotherm (ModelIsotherm,) -- Model isotherm containing the parameters for calculation of $Psi$.

  • pressure (float,) -- Pressure at which to calculate the adsorption potential, in Pa.

  • p_sat (float,) -- Saturation pressure of the adsorbate at the isotherm temperature, in Pa.

  • RT (float,) -- The product of the gas constant, $R$ and the isotherm temperature, $T$

Returns:

The Adsorption potential, $varepsilon_{ads}$ in J/mol