Callapy

The physical adsorption of both solute and solvent from liquid solutions onto solids is difficult to determine in widely adopted static (i.e., batch) experiments, because only the bulk liquid reservoir can be probed directly. The consequences of this limitation are best explained by the mass balances. The total mass balance for uptake from a binary mixture can be expressed as

Todo

add figure here

(1)\[V_\text{in}\rho_\text{in} = V_\text{eq}\rho_\text{eq} + m\left(Q_\text{A} + Q_\text{S}\right)\]

where \(V_\text{in}\) is the initial solution volume, \(\rho_\text{in}\) is the initial solution density, \(V_\text{eq}\) is the solution volume measured at equilibrium, \(\rho_\text{eq}\) is the solution density at equilibrium, \(m\) is the mass of the solid, \(Q_\text{A}\) is the loading of the solute A, and \(Q_\text{S}\) is the loading of the solvent S. The mass balance on the solute is

(2)\[V_\text{in}C_\text{A,in} = V_\text{eq}C_\text{A,eq} + m Q_\text{A}\]

where \(C_\text{A,in}\) is the initial concentration of the solute A, and \(C_\text{A,eq}\) is the concentration of the solute A measured at equilibrium.

From the batch adsorption procedure, \(V_\text{in}\), \(C_\text{A,in}\), \(C_\text{A,eq}\), and \(m\) are measured. The initial (\(\rho_\text{in}\)) and equilibrium (\(\rho_\text{eq}\)) densities are usually either determined from separate experiments, taken from available literature reports, or estimated from pure component densities. As a result, Equations (1) and (2) have three unknowns (\(V_\text{eq}\), \(Q_\text{A}\), and \(Q_\text{S}\)), giving them no unique solution.

The excess adsorption (XS) is one common approach. In this case, the volume of solution at equilibrium is assumed to be the same as the initial volume of solution. The third relationship required to close the mass balances is

\[V_\text{in} = V_\text{eq}\]

The solute loading calculated by the XS approach is expressed as

(3)\[Q_{\mathrm{A}}^{\mathrm{XS}} = \frac{V_{\mathrm{in}}\left(C_{\mathrm{A,in}}-C_{\mathrm{A,eq}}\right)}{m}\]

The solvent loading calculated by the XS approach is expressed as

(4)\[Q_{\mathrm{S}}^{\mathrm{XS}} = \frac{V_{\mathrm{in}}\left[ \rho_{\mathrm{in}}-\rho_{\mathrm{eq}}- \left(C_{\mathrm{A,in}}-C_{\mathrm{A,eq}}\right)\right]}{m}\]

Another option is to assume that no solvent (NS) adsorbs into the solid (i.e., only solute adsorbs). The third relationship required to close the mass balances is

(5)\[Q_\text{S} = 0\]

The solute loading calculated by the NS approach can be obtained by

(6)\[Q_{\mathrm{A}}^{\mathrm{NS}} = \frac{ V_{\mathrm{in}}\left[\rho_{\mathrm{in}}-\left( \frac{C_{\mathrm{A,in}}}{C_{\mathrm{A,eq}}}\rho_{\mathrm{eq}}\right)\right]} {m\left(1-\frac{\rho_{\mathrm{eq}}}{C_{\mathrm{A,eq}}}\right)}\]

By definition, the solvent loading for the NS approach is zero.

The volume change by solute adsorption method (VC) estimates the volume change of solution based off of how much solute adsorbs. The third relqtionship required to close the mass balances is

\[V_\text{eq}=V_\text{in} - mQ_\text{A}/\rho_\text{A}\]

The solute loading calculated by the VC method is calculated as

(7)\[Q_{\mathrm{A}}^{\mathrm{VC}} = \frac{V_{\mathrm{in}}\left(C_{\mathrm{A,in}}-C_{\mathrm{A,eq}}\right)}{ m\left(1-\frac{C_{\mathrm{A,eq}}}{\rho_{\mathrm{A}}}\right)}\]

where \(\rho_\text{A}\) is an estimated adsorbed density of the solute A. The solvent loading calculated by the VC approach is expressed as

(8)\[Q_{\mathrm{S}}^{\mathrm{VC}} = \frac{V_{\mathrm{in}}}{m}\left[ \rho_{\mathrm{in}}-\rho_{\mathrm{eq}} -\left(1-\frac{\rho_{\mathrm{eq}}}{\rho_{\mathrm{A}}}\right) \left(\frac{C_{\mathrm{A,in}}-C_{\mathrm{A,eq}}} {1-\frac{C_{\mathrm{A,eq}}}{\rho_{\mathrm{A}}}}\right) \right]\]

Another option is to assume that the pores in the solid are filled upon adsorption. The additional relationship is

\[V_\text{p}=Q_\text{A}/\rho_\text{A} + Q_\text{S}/\rho_\text{S}\]

where \(\rho_\text{S}\) is an estimated density of the solvent, and \(V_\text{p}\) is an estimated pore volume of the adsorbent.

For the pore filling model, the solute loading can be calculated as

(9)\[Q_{\mathrm{A}}^{\mathrm{PF}} = \frac{ V_{\mathrm{in}}\left[\rho_{\mathrm{in}}-\left( \frac{C_{\mathrm{A,in}}}{C_{\mathrm{A,eq}}}\rho_{\mathrm{eq}}\right)\right] -m\rho_{\mathrm{S}}V_{\mathrm{p}} }{ m\left(1-\frac{\rho_{\mathrm{eq}}}{C_{\mathrm{A,eq}}} - \frac{\rho_{\mathrm{S}}}{\rho_{\mathrm{A}}}\right) }\]

while the solvent loading can be calculated as

(10)\[Q_{\mathrm{S}}^{\mathrm{PF}} = V_{\mathrm{p}}\rho_{\mathrm{S}}-\frac{\rho_{\mathrm{S}}}{\rho_{\mathrm{A}}}\left( \frac{ V_{\mathrm{in}}\left[\rho_{\mathrm{in}}-\left( \frac{C_{\mathrm{A,in}}}{C_{\mathrm{A,eq}}}\rho_{\mathrm{eq}}\right)\right] -m\rho_{\mathrm{S}}V_{\mathrm{p}} }{ m\left(1-\frac{\rho_{\mathrm{eq}}}{C_{\mathrm{A,eq}}} - \frac{\rho_{\mathrm{S}}}{\rho_{\mathrm{A}}}\right) } \right)\]
class callapy.model.Model(**kwargs)
Parameters
  • V_in (typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]) – initial volume, \(V_\text{in}\)

  • d_in (typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]) – initial density, \(\rho_\text{in}\)

  • d_eq (typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]) – equilibrium density, \(\rho_\text{eq}\)

  • m (typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]) – mass of zeolite, \(m\)

  • CA_in (typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]) – initial concentration of solute A, \(C_\text{A,in}\)

  • CA_eq (typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]) – equilibrium concentration of solute A, \(C_\text{A,eq}\)

  • d_A (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – estimated density of adsorbate used in calculating PF adsorption, defaults to None

  • d_S (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – estimated density of solvent in pores in calculating PF adsoption, defaults to None

  • V_units (str, optional) – units for volume, defaults to “”

  • C_units (str, optional) – units for concentration, defaults to “”

  • m_units (str, optional) – units for mass of solid, defaults to “”

  • d_units (str, optional) – units for density, defaults to “”

  • V_p (float, optional) – estimated pore volume within solid, defaults to None

  • e_V_in (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – error of initial volume, defaults to last decimal point input from Model.V_in

  • e_d_in (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – error of initial density, defaults to last decimal point input from Model.d_in

  • e_d_eq (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – error of equilibrium density, defaults to last decimal point input from Model.d_eq

  • e_m (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – error of adsorbent mass, defaults to last decimal point input from Model.m

  • e_CA_in (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – error of adsorbent mass, defaults to last decimal point input from Model.CA_in

  • e_CA_eq (typing.Optional[typing.Union[float, typing.List, typing.Tuple, typing.Generator, np.array]]) – error of adsorbent mass, defaults to last decimal point input from Model.CA_eq

eval_NS() → Tuple

No-solvent adsorption model (NS)

The solute and solvent loadings are calculated by Equations (6) and (5), respectively.

Parameters

kwargs – key-word arguments

Returns

(\(Q_\text{A}\), \(Q_\text{S}\), \(V_\text{eq}\))

eval_PF()

Pore-filling adsorption model (PF).

The solute and solvent loadings are calculated by Equations (9) and (10), respectively.

Parameters
  • d_A – estimated adsorbed density of solute A, \(\rho_\text{A}\)

  • d_S – estimated adsorbed density of solute S, \(\rho_\text{S}\)

  • V_p – estimated pore volume of solid, \(V_\text{p}\)

  • kwargs – key-word arguments

Returns

(\(Q_\text{A}\), \(Q_\text{S}\), \(V_\text{eq}\))

eval_VC()

Volume change by solute adsorption model (VC)

The solute and solvent loadings are calculated by Equations (7) and (8), respectively.

Parameters
  • d_A – estimated adsorbed density of solute A, \(\rho_\text{A}\)

  • kwargs – key-word arguments

Returns

(\(Q_\text{A}\), \(Q_\text{S}\), \(V_\text{eq}\))

eval_XS() → Tuple

Excess adsorption model (XS)

The solute and solvent loadings are calculated by Equations (3) and (4), respectively.

Parameters

kwargs – key-word arguments

Returns

(\(Q_\text{A}\), \(Q_\text{S}\), \(V_\text{eq}\))