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.isosteric_enth.isosteric_enthalpy(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 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.

pygaps.characterisation.isosteric_enth.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, model: str = 'Toth', loading: list | None = None, verbose: bool = False)[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 'Langmuir' or 'Toth'.

  • 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

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 model isotherm (Langmuir or Toth) to derive the isosteric enthalpy of adsorption \(\Delta H_{st}\). The general form of the equation is;

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

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

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

Whittaker determined \(\Delta \lambda\) as:

\[\Delta \lambda = RT \ln{\left[\left(\frac{p^0}{b^{1/t}}\right)\left(\frac{\Theta^{t}}{1-\Theta^{t}}\right) \right]}\]

Where \(p^0\) is the saturation pressure, \(\Theta\) is the fractional coverage, and \(b\) is derived from the equilibrium constant, \(K\) as \(b = \frac{1}{K^t}\). In the case that the adsorptive is above is supercritical, the pseudo saturation pressure is used; \(p^0 = p_c \left(\frac{T}{T_c}\right)^2\).

The exponent \(t\) is only relevant to the Toth version of the method, as for the Langmuir model it reduces to 1. Thus, \(\Delta \lambda\) becomes

\[\Delta \lambda = RT \ln{ \left( \frac{p^0}{b} \right) }\]

References

pygaps.characterisation.enth_sorp_whittaker.enthalpy_sorption_whittaker_raw(p: float | None = None, p_sat: float | None = None, K: float | None = None, n: float | None = None, n_m: float | None = None)[source]#

not using yet, placeholder for function that may be helpful for DSLangmuir version.