open-atmos / PySDM

Pythonic particle-based (super-droplet) warm-rain/aqueous-chemistry cloud microphysics package with box, parcel & 1D/2D prescribed-flow examples in Python, Julia and Matlab
https://open-atmos.github.io/PySDM/
GNU General Public License v3.0
56 stars 29 forks source link

Add more alternative representations of surface-partitioning for organics #630

Closed claresinger closed 2 years ago

claresinger commented 2 years ago

The current compressed film framework implemented is one (very simple) option based on Lowe et al (2019) and Ovadnevaite et al (2017). We'd like to 1) rename this option and 2) add another (slightly more complex version) based on Ruehl et al (2016).

I have preliminary python code for Ruehl. This model iteratively solves for the fraction of organic that stays at the surface in the film (vs. dissolves into the bulk phase), and thus adds one more degree of freedom to the representation of the surface-partitioning.

def sigma_Ruehl(T, v_wet, v_dry, f_org, nu_org):
    Cb_iso = (f_org*v_dry/nu_org) / (v_wet/nu_w) # = C_bulk / (1-f_surf)
    r_wet = ((3 * v_wet) / (4 * np.pi))**(1/3) # m - wet radius
    A_iso = (4*np.pi*r_wet**2) / (f_org*v_dry*NA/nu_org) # m^2 = A*f_surf

    f = lambda f_surf: Cb_iso*(1-f_surf) - C0*np.exp(((A0**2 - (A_iso/f_surf)**2)*m_sigma*NA)/(2*R*T))
    sol = root_scalar(f, bracket=[0,1])
    f_surf = sol.root

    sgm = sgm_w - (A0 - A_iso/f_surf)*m_sigma # m^2 * J/m^2 = J = N*m --> N/m - N*m ?
    sgm = np.minimum(np.maximum(sgm, sgm_min), sgm_w)
    return sgm
slayoo commented 2 years ago

@claresinger is nu_org needed to be added as particle attribute? If so, how to initialize and vary it?

claresinger commented 2 years ago

Yes... this may require a longer discussion @rxward.

In this model of the surface-partitioning we explicitly need to know the "molar volume" of the organic phase in the surface tension calculation. It's similar to how we needed the molar volume previously in the calculation of Köhler curves, but we were able to roll this into kappa. I'm not sure if something similar can be done here, I need to think about it more, but I will guess maybe it can't and we'll need to add another attribute?