Skip to content

polykin.thermo.acm¤

ScatchardHildebrand ¤

Scatchard-Hildebrand multicomponent activity coefficient model.

This model is based on the following molar excess Gibbs energy expression:

\[ g^{E} = \left( \sum_i x_i v_i \right) \left( \sum_i \phi_i (\delta_i - \bar{\delta})^2 \right) \]

where \(x_i\) are the mole fractions, \(\delta_{i}\) are the solubility parameters, and \(v_i\) are the molar volumes. Moreover, \(\phi_i\) are the volume fractions defined as:

\[ \phi_i = \frac{x_i v_i}{\sum_j x_j v_j} \]

and \(\bar{\delta}\) is the average solubility parameter:

\[ \bar{\delta} = \sum_i \phi_i \delta_i \]

Note

The solubility parameters and the molar volumes can be expressed in any length units, as long as they are consistent with each other.

References

  • Prausnitz, J. M.; Lichtenthaler, R. N.; de Azevedo, E. G. Molecular Thermodynamics of Fluid-Phase Equilibria, 3rd ed.; Prentice Hall, 1999, p. 325.
PARAMETER DESCRIPTION
N

Number of components.

TYPE: int

delta

Solubility parameters of all components [(J/L³)^(1/2)].

TYPE: FloatVectorLike(N)

v

Molar volumes of all components [L³/mol].

TYPE: FloatVectorLike(N)

name

Name of the model instance.

TYPE: str DEFAULT: ''

See Also
Source code in src/polykin/thermo/acm/scatchard.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class ScatchardHildebrand(MolecularACM):
    r"""Scatchard-Hildebrand multicomponent activity coefficient model.

    This model is based on the following molar excess Gibbs energy expression:

    $$ g^{E} = \left( \sum_i x_i v_i \right)
               \left( \sum_i \phi_i (\delta_i - \bar{\delta})^2 \right) $$

    where $x_i$ are the mole fractions, $\delta_{i}$ are the solubility parameters, and
    $v_i$ are the molar volumes. Moreover, $\phi_i$ are the volume fractions defined as:

    $$ \phi_i = \frac{x_i v_i}{\sum_j x_j v_j} $$

    and $\bar{\delta}$ is the average solubility parameter:

    $$ \bar{\delta} = \sum_i \phi_i \delta_i $$

    !!! note

        The solubility parameters and the molar volumes can be expressed in any length
        units, as long as they are consistent with each other.

    **References**

    *   Prausnitz, J. M.; Lichtenthaler, R. N.; de Azevedo, E. G. Molecular Thermodynamics
        of Fluid-Phase Equilibria, 3rd ed.; Prentice Hall, 1999, p. 325.

    Parameters
    ----------
    N : int
        Number of components.
    delta : FloatVectorLike (N)
        Solubility parameters of all components [(J/L³)^(1/2)].
    v : FloatVectorLike (N)
        Molar volumes of all components [L³/mol].
    name : str
        Name of the model instance.

    See Also
    --------
    * [`ScatchardHildebrand_gamma`](ScatchardHildebrand_gamma.md):
      Related activity coefficient method.
    """

    delta: FloatVector
    v: FloatVector

    def __init__(
        self,
        N: int,
        delta: FloatVectorLike,
        v: FloatVectorLike,
        name: str = "",
    ) -> None:

        delta = np.asarray(delta, dtype=float)
        v = np.asarray(v, dtype=float)

        check_shape(delta, (N,), "delta")
        check_shape(v, (N,), "v")

        super().__init__(N, name)
        self.delta = delta
        self.v = v

    def gE(self, T: float, x: FloatVector) -> float:

        v = self.v
        delta = self.delta

        phi = x * v
        vm = phi.sum()
        phi /= vm

        δm = dot(phi, delta)

        return vm * dot(phi, (delta - δm) ** 2)

    @override
    def gamma(self, T: float, x: FloatVector) -> FloatVector:
        return ScatchardHildebrand_gamma(T, x, self.delta, self.v)

Dgmix ¤

Dgmix(T: float, x: FloatVector) -> float

Calculate the molar Gibbs energy of mixing.

\[ \Delta_{mix} g = g^E + R T \sum_i {x_i \ln{x_i}} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
float

Molar Gibbs energy of mixing [J/mol].

Source code in src/polykin/thermo/acm/base.py
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def Dgmix(self, T: float, x: FloatVector) -> float:
    r"""Calculate the molar Gibbs energy of mixing.

    $$ \Delta_{mix} g = g^E + R T \sum_i {x_i \ln{x_i}} $$

    Parameters
    ----------
    T : float
        Temperature [K].
    x : FloatVector (N)
        Mole fractions of all components [mol/mol].

    Returns
    -------
    float
        Molar Gibbs energy of mixing [J/mol].
    """
    return self.gE(T, x) - T * self._Dsmix_ideal(T, x)

Dhmix ¤

Dhmix(T: float, x: FloatVector) -> float

Calculate the molar enthalpy of mixing.

\[ \Delta_{mix} h = h^{E} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
float

Molar enthalpy of mixing [J/mol].

Source code in src/polykin/thermo/acm/base.py
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
def Dhmix(self, T: float, x: FloatVector) -> float:
    r"""Calculate the molar enthalpy of mixing.

    $$ \Delta_{mix} h = h^{E} $$

    Parameters
    ----------
    T : float
        Temperature [K].
    x : FloatVector (N)
        Mole fractions of all components [mol/mol].

    Returns
    -------
    float
        Molar enthalpy of mixing [J/mol].
    """
    return self.hE(T, x)

Dsmix ¤

Dsmix(T: float, x: FloatVector) -> float

Calculate the molar entropy of mixing.

\[ \Delta_{mix} s = s^{E} - R \sum_i {x_i \ln{x_i}} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
float

Molar entropy of mixing [J/(mol·K)].

Source code in src/polykin/thermo/acm/base.py
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
def Dsmix(self, T: float, x: FloatVector) -> float:
    r"""Calculate the molar entropy of mixing.

    $$ \Delta_{mix} s = s^{E} - R \sum_i {x_i \ln{x_i}} $$

    Parameters
    ----------
    T : float
        Temperature [K].
    x : FloatVector (N)
        Mole fractions of all components [mol/mol].

    Returns
    -------
    float
        Molar entropy of mixing [J/(mol·K)].
    """
    return self.sE(T, x) + self._Dsmix_ideal(T, x)

N property ¤

N: int

Number of components.

activity ¤

activity(T: float, x: FloatVector) -> FloatVector

Calculate the activities.

\[ a_i = x_i \gamma_i \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
FloatVector(N)

Activities of all components.

Source code in src/polykin/thermo/acm/base.py
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
def activity(self, T: float, x: FloatVector) -> FloatVector:
    r"""Calculate the activities.

    $$ a_i = x_i \gamma_i $$

    Parameters
    ----------
    T : float
        Temperature [K].
    x : FloatVector (N)
        Mole fractions of all components [mol/mol].

    Returns
    -------
    FloatVector (N)
        Activities of all components.
    """
    return x * self.gamma(T, x)

gE ¤

gE(T: float, x: FloatVector) -> float

Calculate the molar excess Gibbs energy.

\[ g^{E} \equiv g - g^{id} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
float

Molar excess Gibbs energy [J/mol].

Source code in src/polykin/thermo/acm/scatchard.py
82
83
84
85
86
87
88
89
90
91
92
93
def gE(self, T: float, x: FloatVector) -> float:

    v = self.v
    delta = self.delta

    phi = x * v
    vm = phi.sum()
    phi /= vm

    δm = dot(phi, delta)

    return vm * dot(phi, (delta - δm) ** 2)

gamma ¤

gamma(T: float, x: FloatVector) -> FloatVector

Calculate the activity coefficients based on mole fraction.

\[ \ln \gamma_i = \frac{1}{RT} \left( \frac{\partial (n g^E)}{\partial n_i} \right)_{T,P,n_j} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
FloatVector(N)

Activity coefficients of all components.

Source code in src/polykin/thermo/acm/scatchard.py
95
96
97
@override
def gamma(self, T: float, x: FloatVector) -> FloatVector:
    return ScatchardHildebrand_gamma(T, x, self.delta, self.v)

hE ¤

hE(T: float, x: FloatVector) -> float

Calculate the molar excess enthalpy.

\[ h^{E} = g^{E} + T s^{E} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
float

Molar excess enthalpy [J/mol].

Source code in src/polykin/thermo/acm/base.py
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
def hE(self, T: float, x: FloatVector) -> float:
    r"""Calculate the molar excess enthalpy.

    $$ h^{E} = g^{E} + T s^{E} $$

    Parameters
    ----------
    T : float
        Temperature [K].
    x : FloatVector (N)
        Mole fractions of all components [mol/mol].

    Returns
    -------
    float
        Molar excess enthalpy [J/mol].
    """
    return self.gE(T, x) + T * self.sE(T, x)

sE ¤

sE(T: float, x: FloatVector) -> float

Calculate the molar excess entropy.

\[ s^{E} = -\left(\frac{\partial g^{E}}{\partial T}\right)_{P,x_i} \]
PARAMETER DESCRIPTION
T

Temperature [K].

TYPE: float

x

Mole fractions of all components [mol/mol].

TYPE: FloatVector(N)

RETURNS DESCRIPTION
float

Molar excess entropy [J/(mol·K)].

Source code in src/polykin/thermo/acm/base.py
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
def sE(self, T: float, x: FloatVector) -> float:
    r"""Calculate the molar excess entropy.

    $$ s^{E} = -\left(\frac{\partial g^{E}}{\partial T}\right)_{P,x_i} $$

    Parameters
    ----------
    T : float
        Temperature [K].
    x : FloatVector (N)
        Mole fractions of all components [mol/mol].

    Returns
    -------
    float
        Molar excess entropy [J/(mol·K)].
    """
    return -1 * derivative_complex(lambda T_: self.gE(T_, x), T)[0]