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/molloading(array) : the loading for each point of the isosteric enthalpy, in mmolslopes(array) : the exact log(p) vs 1/T slope for each pointcorrelation(array) : correlation coefficient for each pointstd_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_clapeyron.isosteric_enthalpy_rawlow 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, 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/molloading(array) : the loading for each point of the isosteric enthalpy, in mmol/gmodel_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