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.
@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