PySDM.physics.surface_tension.szyszkowski_langmuir

surface tension coefficient model featuring surface-partitioning as in Ruehl et al. (2016)

 1"""
 2surface tension coefficient model featuring surface-partitioning
 3 as in [Ruehl et al. (2016)](https://doi.org/10.1126/science.aad4889)
 4"""
 5
 6import numpy as np
 7
 8
 9class SzyszkowskiLangmuir:  # pylint: disable=too-few-public-methods
10    """
11    Szyszkowski-Langmuir surface-partitioning of organics described in Ruehl et al. (2016).
12    Described in supplementary materials equations (12) and (14).
13
14    Allows for more realistic thermodynamic partitioning of some organic to the surface,
15    while some remains dissolved in the bulk phase. The surface concentration is solved
16    implicitly from the isotherm equation that relates the bulk organic concentration
17    `C_bulk` to the surface average molecular area `A`. The equation of state relates
18    the surface concentration to the surface tension.
19    """
20
21    def __init__(self, const):
22        assert np.isfinite(const.RUEHL_nu_org)
23        assert np.isfinite(const.RUEHL_A0)
24        assert np.isfinite(const.RUEHL_C0)
25        assert np.isfinite(const.RUEHL_sgm_min)
26
27    @staticmethod
28    def sigma(const, T, v_wet, v_dry, f_org):
29        # wet radius (m)
30        r_wet = ((3 * v_wet) / (4 * np.pi)) ** (1 / 3)
31
32        if f_org == 0:
33            sgm = const.sgm_w
34        else:
35            # C_bulk is the concentration of the organic in the bulk phase
36            # Cb_iso = C_bulk / (1-f_surf)
37            Cb_iso = (f_org * v_dry / const.RUEHL_nu_org) / (
38                v_wet / const.water_molar_volume
39            )
40
41            # A is the area that one molecule of organic occupies at the droplet surface
42            # A_iso = A*f_surf (m^2)
43            A_iso = (4 * np.pi * r_wet**2) / (
44                f_org * v_dry * const.N_A / const.RUEHL_nu_org
45            )
46
47            # fraction of organic at surface
48            # quadratic formula, solve equation of state analytically
49            a = -const.RUEHL_A0 / A_iso
50            b = (
51                const.RUEHL_A0 / A_iso
52                + (const.RUEHL_A0 / A_iso) * (const.RUEHL_C0 / Cb_iso)
53                + 1
54            )
55            c = -1
56            f_surf = (-b + np.sqrt(b**2 - 4 * a * c)) / (2 * a)
57
58            # calculate surface tension
59            sgm = const.sgm_w - (
60                (const.R_str * T) / (const.RUEHL_A0 * const.N_A)
61            ) * np.log(1 + Cb_iso * (1 - f_surf) / const.RUEHL_C0)
62
63        # surface tension bounded between sgm_min and sgm_w
64        sgm = min(max(sgm, const.RUEHL_sgm_min), const.sgm_w)
65        return sgm
66
67
68SzyszkowskiLangmuir.sigma.__vectorize = True
class SzyszkowskiLangmuir:
10class SzyszkowskiLangmuir:  # pylint: disable=too-few-public-methods
11    """
12    Szyszkowski-Langmuir surface-partitioning of organics described in Ruehl et al. (2016).
13    Described in supplementary materials equations (12) and (14).
14
15    Allows for more realistic thermodynamic partitioning of some organic to the surface,
16    while some remains dissolved in the bulk phase. The surface concentration is solved
17    implicitly from the isotherm equation that relates the bulk organic concentration
18    `C_bulk` to the surface average molecular area `A`. The equation of state relates
19    the surface concentration to the surface tension.
20    """
21
22    def __init__(self, const):
23        assert np.isfinite(const.RUEHL_nu_org)
24        assert np.isfinite(const.RUEHL_A0)
25        assert np.isfinite(const.RUEHL_C0)
26        assert np.isfinite(const.RUEHL_sgm_min)
27
28    @staticmethod
29    def sigma(const, T, v_wet, v_dry, f_org):
30        # wet radius (m)
31        r_wet = ((3 * v_wet) / (4 * np.pi)) ** (1 / 3)
32
33        if f_org == 0:
34            sgm = const.sgm_w
35        else:
36            # C_bulk is the concentration of the organic in the bulk phase
37            # Cb_iso = C_bulk / (1-f_surf)
38            Cb_iso = (f_org * v_dry / const.RUEHL_nu_org) / (
39                v_wet / const.water_molar_volume
40            )
41
42            # A is the area that one molecule of organic occupies at the droplet surface
43            # A_iso = A*f_surf (m^2)
44            A_iso = (4 * np.pi * r_wet**2) / (
45                f_org * v_dry * const.N_A / const.RUEHL_nu_org
46            )
47
48            # fraction of organic at surface
49            # quadratic formula, solve equation of state analytically
50            a = -const.RUEHL_A0 / A_iso
51            b = (
52                const.RUEHL_A0 / A_iso
53                + (const.RUEHL_A0 / A_iso) * (const.RUEHL_C0 / Cb_iso)
54                + 1
55            )
56            c = -1
57            f_surf = (-b + np.sqrt(b**2 - 4 * a * c)) / (2 * a)
58
59            # calculate surface tension
60            sgm = const.sgm_w - (
61                (const.R_str * T) / (const.RUEHL_A0 * const.N_A)
62            ) * np.log(1 + Cb_iso * (1 - f_surf) / const.RUEHL_C0)
63
64        # surface tension bounded between sgm_min and sgm_w
65        sgm = min(max(sgm, const.RUEHL_sgm_min), const.sgm_w)
66        return sgm

Szyszkowski-Langmuir surface-partitioning of organics described in Ruehl et al. (2016). Described in supplementary materials equations (12) and (14).

Allows for more realistic thermodynamic partitioning of some organic to the surface, while some remains dissolved in the bulk phase. The surface concentration is solved implicitly from the isotherm equation that relates the bulk organic concentration C_bulk to the surface average molecular area A. The equation of state relates the surface concentration to the surface tension.

SzyszkowskiLangmuir(const)
22    def __init__(self, const):
23        assert np.isfinite(const.RUEHL_nu_org)
24        assert np.isfinite(const.RUEHL_A0)
25        assert np.isfinite(const.RUEHL_C0)
26        assert np.isfinite(const.RUEHL_sgm_min)
@staticmethod
def sigma(const, T, v_wet, v_dry, f_org):
28    @staticmethod
29    def sigma(const, T, v_wet, v_dry, f_org):
30        # wet radius (m)
31        r_wet = ((3 * v_wet) / (4 * np.pi)) ** (1 / 3)
32
33        if f_org == 0:
34            sgm = const.sgm_w
35        else:
36            # C_bulk is the concentration of the organic in the bulk phase
37            # Cb_iso = C_bulk / (1-f_surf)
38            Cb_iso = (f_org * v_dry / const.RUEHL_nu_org) / (
39                v_wet / const.water_molar_volume
40            )
41
42            # A is the area that one molecule of organic occupies at the droplet surface
43            # A_iso = A*f_surf (m^2)
44            A_iso = (4 * np.pi * r_wet**2) / (
45                f_org * v_dry * const.N_A / const.RUEHL_nu_org
46            )
47
48            # fraction of organic at surface
49            # quadratic formula, solve equation of state analytically
50            a = -const.RUEHL_A0 / A_iso
51            b = (
52                const.RUEHL_A0 / A_iso
53                + (const.RUEHL_A0 / A_iso) * (const.RUEHL_C0 / Cb_iso)
54                + 1
55            )
56            c = -1
57            f_surf = (-b + np.sqrt(b**2 - 4 * a * c)) / (2 * a)
58
59            # calculate surface tension
60            sgm = const.sgm_w - (
61                (const.R_str * T) / (const.RUEHL_A0 * const.N_A)
62            ) * np.log(1 + Cb_iso * (1 - f_surf) / const.RUEHL_C0)
63
64        # surface tension bounded between sgm_min and sgm_w
65        sgm = min(max(sgm, const.RUEHL_sgm_min), const.sgm_w)
66        return sgm