diff --git a/.github/workflows/tests+artifacts+pypi.yml b/.github/workflows/tests+artifacts+pypi.yml index 033e7d15c..1fda9744c 100644 --- a/.github/workflows/tests+artifacts+pypi.yml +++ b/.github/workflows/tests+artifacts+pypi.yml @@ -215,7 +215,7 @@ jobs: test-suite: [ "chemistry_freezing_isotopes", "condensation_a", "condensation_b", "coagulation", "breakup", "multi-process_a", "multi-process_b"] fail-fast: false runs-on: ${{ matrix.platform }} - timeout-minutes: 45 + timeout-minutes: 50 steps: - uses: actions/checkout@v4.1.1 with: diff --git a/PySDM/physics/constants_defaults.py b/PySDM/physics/constants_defaults.py index 0715f6085..af9ede383 100644 --- a/PySDM/physics/constants_defaults.py +++ b/PySDM/physics/constants_defaults.py @@ -312,7 +312,7 @@ """ TODO #1266 """ diffussion_thermics_D_G11_A = 1e-5 * si.m**2 / si.s -diffussion_thermics_D_G11_B = 0.15 / si.K +diffussion_thermics_D_G11_B = 0.015 / si.K diffussion_thermics_D_G11_C = -1.9 diffussion_thermics_K_G11_A = 1.5e-11 * si.W / si.m / si.K**4 @@ -386,3 +386,20 @@ def compute_derived_values(c: dict): c["water_molar_volume"] = c["Mv"] / c["rho_w"] c["rho_STP"] = c["p_STP"] / c["Rd"] / c["T_STP"] c["H_u"] = c["M"] / c["p_STP"] + + +W76W_G0 = -2.9912729e3 * si.K**2 +W76W_G1 = -6.0170128e3 * si.K +W76W_G2 = 1.887643854e1 +W76W_G3 = -2.8354721e-2 * si.K**-1 +W76W_G4 = 1.7838301e-5 * si.K**-2 +W76W_G5 = -8.4150417e-10 * si.K**-3 +W76W_G6 = 4.4412543e-13 * si.K**-4 +W76W_G7 = 2.858487 +W76W_G8 = 1 * si.Pa + +B80W_G0 = 6.112 * si.hPa +B80W_G1 = 17.67 * si.dimensionless +B80W_G2 = 243.5 * si.K + +one_kelvin = 1 * si.K diff --git a/PySDM/physics/diffusion_kinetics/__init__.py b/PySDM/physics/diffusion_kinetics/__init__.py index 0736a7a55..5c3594712 100644 --- a/PySDM/physics/diffusion_kinetics/__init__.py +++ b/PySDM/physics/diffusion_kinetics/__init__.py @@ -6,4 +6,3 @@ from .lowe_et_al_2019 import LoweEtAl2019 from .neglect import Neglect from .grabowski_et_al_2011 import GrabowskiEtAl2011 -from .jensen_and_nugent_2017 import JensenAndNugent2017 diff --git a/PySDM/physics/diffusion_kinetics/jensen_and_nugent_2017.py b/PySDM/physics/diffusion_kinetics/jensen_and_nugent_2017.py deleted file mode 100644 index 85afe709e..000000000 --- a/PySDM/physics/diffusion_kinetics/jensen_and_nugent_2017.py +++ /dev/null @@ -1,14 +0,0 @@ -""" -as in [Jensen and Nugent 2017](https://doi.org/10.1175/JAS-D-15-0370.1) -(which refers to [Grabowski et al. (2011)](https://doi.org/10.1016/j.atmosres.2010.10.020) -but uses different gas constant, typo?) -""" - -import numpy as np -from .grabowski_et_al_2011 import GrabowskiEtAl2011 - - -class JensenAndNugent2017(GrabowskiEtAl2011): - @staticmethod - def lambdaD(const, D, T): - return D / np.sqrt(2 * const.Rd * T) diff --git a/PySDM/physics/diffusion_thermics/grabowski_et_al_2011.py b/PySDM/physics/diffusion_thermics/grabowski_et_al_2011.py index 5d633edb5..2060bcb2e 100644 --- a/PySDM/physics/diffusion_thermics/grabowski_et_al_2011.py +++ b/PySDM/physics/diffusion_thermics/grabowski_et_al_2011.py @@ -9,12 +9,14 @@ def __init__(self, _): @staticmethod def D(const, T, p): # pylint: disable=unused-argument + """eq (10)""" return const.diffussion_thermics_D_G11_A * ( const.diffussion_thermics_D_G11_B * T + const.diffussion_thermics_D_G11_C ) @staticmethod def K(const, T, p): # pylint: disable=unused-argument + """eq (12)""" return ( const.diffussion_thermics_K_G11_A * T**3 + const.diffussion_thermics_K_G11_B * T**2 diff --git a/PySDM/physics/impl/fake_unit_registry.py b/PySDM/physics/impl/fake_unit_registry.py index 8d9fa9401..0eb1faea4 100644 --- a/PySDM/physics/impl/fake_unit_registry.py +++ b/PySDM/physics/impl/fake_unit_registry.py @@ -14,6 +14,7 @@ def __init__(self, si): self.dimensionless = 1.0 for prefix in ("nano", "micro", "milli", "centi", "", "hecto", "kilo"): for unit in ( + "bar", "metre", "gram", "hertz", @@ -35,6 +36,7 @@ def __init__(self, si): for prefix in ("n", "u", "m", "c", "", "h", "k"): for unit in ( + "b", "m", "g", "Hz", @@ -47,7 +49,7 @@ def __init__(self, si): "Pa", "l", "h", - "bar", + "bar", # note: "b" is barn !!! "N", "W", ): diff --git a/PySDM/physics/saturation_vapour_pressure/__init__.py b/PySDM/physics/saturation_vapour_pressure/__init__.py index 6253569b5..9ac3cb742 100644 --- a/PySDM/physics/saturation_vapour_pressure/__init__.py +++ b/PySDM/physics/saturation_vapour_pressure/__init__.py @@ -6,3 +6,5 @@ from .flatau_walko_cotton import FlatauWalkoCotton from .lowe1977 import Lowe1977 from .murphy_koop_2005 import MurphyKoop2005 +from .wexler_1976 import Wexler1976 +from .bolton_1980 import Bolton1980 diff --git a/PySDM/physics/saturation_vapour_pressure/bolton_1980.py b/PySDM/physics/saturation_vapour_pressure/bolton_1980.py new file mode 100644 index 000000000..2ef5934d0 --- /dev/null +++ b/PySDM/physics/saturation_vapour_pressure/bolton_1980.py @@ -0,0 +1,20 @@ +""" +[Bolton 1980](https://doi.org/10.1175/1520-0493(1980)108<1046:TCOEPT>2.0.CO;2) +""" + +import numpy as np + + +class Bolton1980: + def __init__(self, _): + pass + + @staticmethod + def pvs_Celsius(const, T): + """valid for -30 <= T <= 35 C, eq (10)""" + return const.B80W_G0 * np.exp((const.B80W_G1 * T) / (T + const.B80W_G2)) + + @staticmethod + def ice_Celsius(const, T): + """NaN with unit of pressure and correct dimension""" + return np.nan * T / const.B80W_G2 * const.B80W_G0 diff --git a/PySDM/physics/saturation_vapour_pressure/wexler_1976.py b/PySDM/physics/saturation_vapour_pressure/wexler_1976.py new file mode 100644 index 000000000..9d82366bd --- /dev/null +++ b/PySDM/physics/saturation_vapour_pressure/wexler_1976.py @@ -0,0 +1,31 @@ +""" +[Wexler 1976](https://nvlpubs.nist.gov/nistpubs/jres/80A/jresv80An5-6p775_A1b.pdf) +""" + +import numpy as np + + +class Wexler1976: + def __init__(self, _): + pass + + @staticmethod + def pvs_Celsius(const, T): + return ( + np.exp( + const.W76W_G0 / (T + const.T0) ** 2 + + const.W76W_G1 / (T + const.T0) + + const.W76W_G2 + + const.W76W_G3 * (T + const.T0) + + const.W76W_G4 * (T + const.T0) ** 2 + + const.W76W_G5 * (T + const.T0) ** 3 + + const.W76W_G6 * (T + const.T0) ** 4 + + const.W76W_G7 * np.log((T + const.T0) / const.one_kelvin) + ) + * const.W76W_G8 + ) + + @staticmethod + def ice_Celsius(const, T): + """NaN with unit of pressure and correct dimension""" + return np.nan * T / const.B80W_G2 * const.B80W_G0 diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb index bb0c60717..0b593272b 100644 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb @@ -4,10 +4,7 @@ "cell_type": "markdown", "id": "a68bae6de370294c", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "source": [ "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb) \n", @@ -19,10 +16,7 @@ "cell_type": "markdown", "id": "67f1a1164c2629c6", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "source": [ "#### based on Fig. 1 from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)" @@ -34,8 +28,8 @@ "id": "605d5fe5", "metadata": { "ExecuteTime": { - "end_time": "2024-02-01T07:33:00.814600Z", - "start_time": "2024-02-01T07:33:00.806057Z" + "end_time": "2024-03-04T11:31:45.383883Z", + "start_time": "2024-03-04T11:31:45.379202Z" } }, "outputs": [], @@ -49,1529 +43,31 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "initial_id", "metadata": { "ExecuteTime": { - "end_time": "2024-02-16T10:30:08.524789Z", - "start_time": "2024-02-16T10:30:08.067737Z" + "end_time": "2024-03-04T11:31:50.944088Z", + "start_time": "2024-03-04T11:31:50.361661Z" } }, "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2024-02-18T00:34:33.302923\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.8.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2024-03-04T12:31:50.875143\n image/svg+xml\n \n \n Matplotlib v3.8.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "metadata": {}, "output_type": "display_data" }, { "data": { + "text/plain": "HTML(value=\"./fig_1.pdf
\")", "application/vnd.jupyter.widget-view+json": { - "model_id": "bc804db7f9dc44f397325605c43edbb3", "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HTML(value=\"./fig_1.pdf
\")" - ] + "version_minor": 0, + "model_id": "c9f88210450743e28203d8c6db9c215a" + } }, "metadata": {}, "output_type": "display_data" @@ -1601,12 +97,15 @@ "\n", "pyplot.loglog(\n", " in_unit(rd, X_UNIT),\n", - " in_unit(dN_dlogr, Y_UNIT)\n", + " in_unit(dN_dlogr, Y_UNIT),\n", + " label='Modified polluted'\n", ")\n", "pyplot.loglog(\n", " in_unit(table_3.RD, X_UNIT),\n", - " in_unit(trivia.dn_dlogr(table_3.RD, table_3.NA / TABLE3_DR), Y_UNIT)\n", + " in_unit(trivia.dn_dlogr(table_3.RD, table_3.NA / TABLE3_DR), Y_UNIT),\n", + " label='VOCALS GCCN'\n", ")\n", + "pyplot.legend()\n", "pyplot.xlabel(\"r$_d$ (µm)\")\n", "pyplot.xlim(\n", " in_unit(rd[0], si.um),\n", @@ -1620,9 +119,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "7ecdcaaa-0d41-49cf-ae2c-7748e8e8dca3", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-04T11:31:48.375619Z", + "start_time": "2024-03-04T11:31:48.372442Z" + } + }, "outputs": [], "source": [] } diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb similarity index 56% rename from examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb rename to examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb index 03f97e592..f499fa833 100644 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb @@ -4,28 +4,22 @@ "cell_type": "markdown", "id": "70b9d65563d58a62", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "source": [ - "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb) \n", - "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb)\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb)" + "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb) \n", + "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb)" ] }, { "cell_type": "markdown", "id": "d1dc2b61d9602b70", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "source": [ - "#### based on Fig. 3 from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)" + "#### based on Fig. 3 and Table 4 (Modified Polluted) from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)" ] }, { @@ -34,8 +28,8 @@ "id": "879850e1", "metadata": { "ExecuteTime": { - "end_time": "2024-02-01T07:33:00.814600Z", - "start_time": "2024-02-01T07:33:00.806057Z" + "end_time": "2024-03-24T15:36:09.631730Z", + "start_time": "2024-03-24T15:36:09.627733Z" } }, "outputs": [], @@ -49,19 +43,20 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "id": "initial_id", "metadata": { "ExecuteTime": { - "end_time": "2024-02-15T09:41:37.753141Z", - "start_time": "2024-02-15T09:41:35.729074Z" + "end_time": "2024-03-24T15:51:52.064243Z", + "start_time": "2024-03-24T15:51:49.276931Z" } }, "outputs": [], "source": [ + "from IPython.display import display, HTML\n", "from PySDM_examples.Jensen_and_Nugent_2017 import Settings, Simulation\n", "from open_atmos_jupyter_utils import show_plot\n", - "from PySDM_examples.Jensen_and_Nugent_2017.plotting import figure\n", + "from PySDM_examples.Jensen_and_Nugent_2017.plotting import figure, compute_table_values\n", "\n", "settings = Settings(aerosol=\"modified polluted\", cloud_type=\"Sc\")\n", "simulation = Simulation(settings)" @@ -73,17 +68,14 @@ "id": "b184e2c6ac313a7a", "metadata": { "ExecuteTime": { - "end_time": "2024-02-15T09:41:00.472246Z", - "start_time": "2024-02-15T09:40:52.595776Z" + "end_time": "2024-03-24T15:51:53.232151Z", + "start_time": "2024-03-24T15:51:52.064598Z" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "outputs": [], "source": [ - "output = simulation.run()" + "output = simulation.run(steps_per_output_interval= 5)" ] }, { @@ -92,13 +84,10 @@ "id": "7cd7b3fd3774c9b4", "metadata": { "ExecuteTime": { - "end_time": "2024-02-15T09:41:00.973110Z", - "start_time": "2024-02-15T09:41:00.473033Z" + "end_time": "2024-03-24T15:51:53.707434Z", + "start_time": "2024-03-24T15:51:53.246458Z" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "outputs": [ { @@ -107,16 +96,16 @@ "\n", "\n", - "\n", + "\n", " \n", " \n", " \n", " \n", - " 2024-02-18T00:38:45.360025\n", + " 2024-03-24T17:40:39.922200\n", " image/svg+xml\n", " \n", " \n", - " Matplotlib v3.8.1, https://matplotlib.org/\n", + " Matplotlib v3.8.2, https://matplotlib.org/\n", " \n", " \n", " \n", @@ -127,42 +116,42 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -438,18 +427,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -457,7 +446,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -688,18 +677,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -709,36 +698,36 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -747,18 +736,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -767,18 +756,18 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -786,26 +775,22 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1844,14 +1639,14 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1907,14 +1702,14 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1928,28 +1723,28 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1957,43 +1752,43 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -2371,11 +2109,11 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "\n" @@ -2390,12 +2128,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b9265782404a46b6a750663101701c28", + "model_id": "94d7ea1d02ad49589d7de1154ede53f2", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "HTML(value=\"./Fig_3.pdf
\")" + "HTML(value=\"./Fig_3new.pdf
\")" ] }, "metadata": {}, @@ -2403,46 +2141,215 @@ } ], "source": [ - "figure(\n", + "masks = figure(\n", " output=output,\n", " settings=settings,\n", " simulation=simulation,\n", " plot_drops_with_dry_radii_um=(.02, .031, .152, .337, .5),\n", " xlim_r_um=(0, 15),\n", - " xlim_S_percent=(-1, 1)\n", + " xlim_S_percent=(-1, 1),\n", + " return_masks=True\n", ")\n", - "show_plot(\"Fig_3.pdf\")" + "\n", + "show_plot(\"Fig_3new.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eabaafa09612b16e", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-24T15:51:53.713353Z", + "start_time": "2024-03-24T15:51:53.710236Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "table_values = compute_table_values(\n", + " height_above_cb_m = (50, 100, 150, 200, 250, 300),\n", + " height_cb_m = 900,\n", + " products=output[\"products\"],\n", + " ascent_mask = masks[\"ascent\"],\n", + ")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "9336dc4ba0d6b0dc", "metadata": { "ExecuteTime": { - "end_time": "2024-02-15T09:38:25.181139Z", - "start_time": "2024-02-15T09:38:25.177633Z" + "end_time": "2024-03-24T15:51:53.726471Z", + "start_time": "2024-03-24T15:51:53.724599Z" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "outputs": [], - "source": [] + "source": [ + "table_html = \"\"\n", + "\n", + "table_html += \"\"\"\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\"\"\"\n", + "row_labels = {\n", + " 'ascent': 'Mod.polluted (Updraft)',\n", + " 'descent': 'Mod.polluted (Downdraft)'\n", + "}\n", + "for case, data in table_values.items():\n", + " for var in data:\n", + " table_html += f\"\"\"\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \"\"\" \n", + "table_html += \"
Aerosols z (m) Mean cloud drop radius (μm)Drop spectral width (μm)Drop dispersion
{row_labels[case]}{var[0]}{var[1]}{var[2]}{var[3]}
\"" + ] }, { "cell_type": "code", - "execution_count": null, - "id": "cba8bfe11ec0f478", + "execution_count": 7, + "id": "5b615403-60e5-4769-ba7d-644fa5821af8", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false + "ExecuteTime": { + "end_time": "2024-03-24T15:51:53.997179Z", + "start_time": "2024-03-24T15:51:53.987186Z" } }, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Aerosols z (m) Mean cloud drop radius (μm)Drop spectral width (μm)Drop dispersion
Mod.polluted (Updraft)505.470.430.079
Mod.polluted (Updraft)1006.780.390.058
Mod.polluted (Updraft)1507.710.370.047
Mod.polluted (Updraft)2008.450.350.041
Mod.polluted (Updraft)2509.080.330.037
Mod.polluted (Updraft)3009.640.320.034
Mod.polluted (Downdraft)3009.640.320.034
Mod.polluted (Downdraft)2509.110.340.038
Mod.polluted (Downdraft)2008.480.370.044
Mod.polluted (Downdraft)1507.740.410.053
Mod.polluted (Downdraft)1006.830.460.068
Mod.polluted (Downdraft)505.570.570.102
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(HTML(table_html))" + ] } ], "metadata": { @@ -2461,7 +2368,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.6" } }, "nbformat": 4, diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb deleted file mode 100644 index d1abc10c5..000000000 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb +++ /dev/null @@ -1,3210 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "ba7d7fea4c326de4", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb) \n", - "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb)\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb)" - ] - }, - { - "cell_type": "markdown", - "id": "83463dbe10afd52", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "#### based on Fig. 4 from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "f2673625", - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-01T07:33:00.814600Z", - "start_time": "2024-02-01T07:33:00.806057Z" - } - }, - "outputs": [], - "source": [ - "import sys\n", - "if 'google.colab' in sys.modules:\n", - " !pip --quiet install \"open-atmos-jupyter-utils\"\n", - " from open_atmos_jupyter_utils import pip_install_on_colab\n", - " pip_install_on_colab('PySDM-examples>=2.45')" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "initial_id", - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-15T09:41:54.067085Z", - "start_time": "2024-02-15T09:41:52.021480Z" - } - }, - "outputs": [], - "source": [ - "from PySDM_examples.Jensen_and_Nugent_2017 import Settings, Simulation\n", - "from open_atmos_jupyter_utils import show_plot\n", - "from PySDM_examples.Jensen_and_Nugent_2017.plotting import figure\n", - "\n", - "settings = Settings(aerosol=\"modified polluted\", cloud_type=\"Sc\")\n", - "simulation = Simulation(settings, gccn=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "153fe91c37fbdea7", - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-15T09:41:40.549483Z", - "start_time": "2024-02-15T09:41:31.433772Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "output = simulation.run()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "a99bff26cf55cd96", - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-15T09:41:41.235476Z", - "start_time": "2024-02-15T09:41:40.550497Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2024-02-18T00:51:47.212604\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.8.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "92b96335a84e4bd2946d7696f08264b1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HTML(value=\"./Fig_4.pdf
\")" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "figure(\n", - " output=output,\n", - " settings=settings,\n", - " simulation=simulation,\n", - " plot_drops_with_dry_radii_um=(.1, 1, 2, 3, 4, 5, 6, 7, 8, 9),\n", - " xlim_r_um=(0, 60),\n", - " xlim_S_percent=(-1, 1)\n", - ")\n", - "show_plot(\"Fig_4.pdf\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e8bfc1fa5d5de653", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_4_bottom_rows.ipynb b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_4_bottom_rows.ipynb new file mode 100644 index 000000000..fcd99fcb2 --- /dev/null +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_4_bottom_rows.ipynb @@ -0,0 +1,4954 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ba7d7fea4c326de4", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_4_bottom_rows.ipynb) \n", + "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_4_bottom_rows.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_4_bottom_rows.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "83463dbe10afd52", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "#### based on Fig. 4, Fig.7 and Table 4 (Modified Polluted + GCCN) from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f2673625", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T16:18:27.545970Z", + "start_time": "2024-03-22T16:18:27.542295Z" + } + }, + "outputs": [], + "source": [ + "import sys\n", + "if 'google.colab' in sys.modules:\n", + " !pip --quiet install \"open-atmos-jupyter-utils\"\n", + " from open_atmos_jupyter_utils import pip_install_on_colab\n", + " pip_install_on_colab('PySDM-examples>=2.45')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "initial_id", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T16:18:30.961400Z", + "start_time": "2024-03-22T16:18:28.074022Z" + } + }, + "outputs": [], + "source": [ + "from matplotlib import pyplot\n", + "import numpy as np\n", + "\n", + "from PySDM_examples.Jensen_and_Nugent_2017 import Settings, Simulation\n", + "from open_atmos_jupyter_utils import show_plot\n", + "from PySDM_examples.Jensen_and_Nugent_2017.plotting import figure, CLOUD_BASE, find_drop_ids_by_dry_size, compute_table_values\n", + "from PySDM.physics import in_unit, si\n", + "from IPython.display import display, HTML\n", + "from PySDM.physics.constants import PER_CENT\n", + "\n", + "settings = Settings(aerosol=\"modified polluted\", cloud_type=\"Sc\")\n", + "simulation = Simulation(settings, gccn=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "153fe91c37fbdea7", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T16:18:32.387429Z", + "start_time": "2024-03-22T16:18:30.965857Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "output = simulation.run(steps_per_output_interval= 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "a99bff26cf55cd96", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T16:18:32.820278Z", + "start_time": "2024-03-22T16:18:32.408087Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-03-24T17:43:49.898900\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.2, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "23a1c49c9bb947668606c8a9538f447d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HTML(value=\"./Fig_4.pdf
\")" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "masks = figure(\n", + " output=output,\n", + " settings=settings,\n", + " simulation=simulation,\n", + " plot_drops_with_dry_radii_um=(.1, 1, 2, 3, 4, 5, 6, 7, 8, 9),\n", + " xlim_r_um=(0, 60),\n", + " xlim_S_percent=(-1, 1),\n", + " return_masks=True\n", + ")\n", + "show_plot(\"Fig_4.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e8bfc1fa5d5de653", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T16:18:33.175467Z", + "start_time": "2024-03-22T16:18:32.849Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-03-24T17:43:50.219540\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.2, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "323e5f64b7d04b1e8501d71407dbd6d8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HTML(value=\"./Fig_7.pdf
\")" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = pyplot.subplot_mosaic(\n", + " mosaic=[[\"ascent\", \"descent\"]],\n", + " width_ratios=[1, 1],\n", + " sharex=True,\n", + " sharey=True,\n", + " \n", + ")\n", + "height_above_cloud_base = np.asarray(output[\"products\"][\"z\"]) - settings.z0 - CLOUD_BASE\n", + "SS = np.asarray(output[\"products\"][\"S_max\"])\n", + "SS_eq = {}\n", + "SS_ef = {}\n", + "for mask_label, mask in masks.items():\n", + " axs[mask_label].plot(\n", + " in_unit(SS, PER_CENT)[mask],\n", + " height_above_cloud_base[mask],\n", + " color='black',\n", + " label='SS (%)'\n", + " )\n", + " dry_radii_um = (0.1, 2, 9)\n", + " colors = ('red', 'green', 'blue')\n", + " for i, drop_id in enumerate(find_drop_ids_by_dry_size(\n", + " plot_drops_with_dry_radii_um=dry_radii_um,\n", + " simulation_r_dry=simulation.r_dry\n", + " )):\n", + " SS_eq[dry_radii_um[i]] = np.asarray(output[\"attributes\"][\"equilibrium supersaturation\"][drop_id]) - 1\n", + " label_suffix = f' for r_d={in_unit(simulation.r_dry[drop_id], si.um):.2} µm'\n", + " axs[mask_label].plot(\n", + " in_unit(SS_eq[dry_radii_um[i]], PER_CENT)[mask],\n", + " height_above_cloud_base[mask],\n", + " label='SS$_{eq}$ (%)' + label_suffix,\n", + " linestyle=':',\n", + " color=colors[i]\n", + " )\n", + " SS_ef[dry_radii_um[i]] = SS - SS_eq[dry_radii_um[i]]\n", + " axs[mask_label].plot(\n", + " in_unit(SS-SS_eq[dry_radii_um[i]], PER_CENT)[mask],\n", + " height_above_cloud_base[mask],\n", + " label='SS$_{eff}$ (%)' + label_suffix,\n", + " linestyle='--',\n", + " color=colors[i]\n", + " )\n", + "\n", + " axs[mask_label].set_title(mask_label)\n", + " axs[mask_label].set_xlim(-3, 3)\n", + " axs[mask_label].set_ylim(0, 600)\n", + " axs[mask_label].legend()\n", + " axs[\"ascent\"].set_ylabel(\"height above cloud base (m)\")\n", + " axs[\"ascent\"].set_xlabel(\"Supersaturation (%)\")\n", + " axs[\"descent\"].set_xlabel(\"Supersaturation (%)\")\n", + " \n", + "show_plot(\"Fig_7.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "eb36cc8fbec5bbe9", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T16:18:34.192455Z", + "start_time": "2024-03-22T16:18:34.189445Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "table_values = compute_table_values(\n", + " height_above_cb_m = (50, 100, 150, 200, 250, 300),\n", + " height_cb_m = 900,\n", + " products=output[\"products\"],\n", + " ascent_mask = masks[\"ascent\"],\n", + ") " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2d078992f5c9993f", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T21:00:33.256150Z", + "start_time": "2024-03-21T21:00:33.240821Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "table_html = \"\"\n", + "table_html += \"\"\"\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\"\"\"\n", + "row_labels = {\n", + " 'ascent': 'Mod.polluted + GCCN (Updraft)',\n", + " 'descent': 'Mod.polluted + GCCN (Downdraft)'\n", + "}\n", + "\n", + "for case, data in table_values.items():\n", + " for var in data: \n", + " table_html += f\"\"\"\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \"\"\" \n", + "\n", + "table_html += \"
Aerosols z (m) Mean cloud drop radius (μm)Drop spectral width (μm)Drop dispersion
{row_labels[case]}{var[0]}{var[1]}{var[2]}{var[3]}
\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e7743277-0296-451f-8d66-e0519ec942f2", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-21T06:11:26.340491Z", + "start_time": "2024-03-21T06:11:26.332723Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Aerosols z (m) Mean cloud drop radius (μm)Drop spectral width (μm)Drop dispersion
Mod.polluted + GCCN (Updraft)505.440.440.082
Mod.polluted + GCCN (Updraft)1006.740.400.059
Mod.polluted + GCCN (Updraft)1507.670.370.049
Mod.polluted + GCCN (Updraft)2008.420.350.042
Mod.polluted + GCCN (Updraft)2509.050.340.038
Mod.polluted + GCCN (Updraft)3009.600.330.034
Mod.polluted + GCCN (Downdraft)3009.600.330.034
Mod.polluted + GCCN (Downdraft)2509.070.350.039
Mod.polluted + GCCN (Downdraft)2008.440.380.045
Mod.polluted + GCCN (Downdraft)1507.690.420.054
Mod.polluted + GCCN (Downdraft)1006.770.470.070
Mod.polluted + GCCN (Downdraft)505.480.590.107
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(HTML(table_html))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36fe694861b15027", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb index 299474936..15324d6a7 100644 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb @@ -4,10 +4,7 @@ "cell_type": "markdown", "id": "9f37f66f49adc99b", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "source": [ "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb) \n", @@ -19,10 +16,7 @@ "cell_type": "markdown", "id": "af8a61829aba28c", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "source": [ "#### based on Fig. 6 from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)\n" @@ -34,8 +28,8 @@ "id": "284358c5", "metadata": { "ExecuteTime": { - "end_time": "2024-02-01T07:33:00.814600Z", - "start_time": "2024-02-01T07:33:00.806057Z" + "end_time": "2024-03-04T14:32:02.816749Z", + "start_time": "2024-03-04T14:32:02.812278Z" } }, "outputs": [], @@ -49,12 +43,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "id": "initial_id", "metadata": { "ExecuteTime": { - "end_time": "2024-02-15T09:43:57.169474Z", - "start_time": "2024-02-15T09:43:55.296686Z" + "end_time": "2024-03-04T16:25:16.587545Z", + "start_time": "2024-03-04T16:25:14.461586Z" } }, "outputs": [], @@ -64,7 +58,7 @@ "from PySDM_examples.Jensen_and_Nugent_2017.plotting import figure\n", "from PySDM.physics import si\n", "\n", - "settings = Settings(aerosol=\"modified polluted\", cloud_type=\"Cu\")\n", + "settings = Settings(aerosol=\"modified polluted\", cloud_type=\"Cu\", dt=.5 * si.s)\n", "simulation = Simulation(settings, gccn=True)" ] }, @@ -73,18 +67,18 @@ "execution_count": 3, "id": "6e80d470aed47e31", "metadata": { - "ExecuteTime": { - "end_time": "2024-02-15T09:44:04.929857Z", - "start_time": "2024-02-15T09:43:57.193222Z" - }, "collapsed": false, - "jupyter": { - "outputs_hidden": false + "ExecuteTime": { + "end_time": "2024-03-04T14:32:17.032250Z", + "start_time": "2024-03-04T14:32:08.997662Z" } }, "outputs": [], "source": [ - "output = simulation.run(n_steps=int(1800 * si.m / settings.vertical_velocity / settings.dt))" + "output = simulation.run(\n", + " n_steps=int(1800 * si.m / settings.vertical_velocity / settings.dt),\n", + " steps_per_output_interval=5\n", + ")" ] }, { @@ -92,2738 +86,29 @@ "execution_count": 4, "id": "6341693a2ee4bd21", "metadata": { - "ExecuteTime": { - "end_time": "2024-02-15T09:44:37.308751Z", - "start_time": "2024-02-15T09:44:36.769054Z" - }, "collapsed": false, - "jupyter": { - "outputs_hidden": false + "ExecuteTime": { + "end_time": "2024-03-04T14:32:17.774679Z", + "start_time": "2024-03-04T14:32:17.033939Z" } }, "outputs": [ { "data": { - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2024-02-18T00:59:33.117652\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.8.1, https://matplotlib.org/\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2024-03-04T15:32:17.729911\n image/svg+xml\n \n \n Matplotlib v3.8.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n" }, "metadata": {}, "output_type": "display_data" }, { "data": { + "text/plain": "HTML(value=\"./Fig_6.pdf
\")", "application/vnd.jupyter.widget-view+json": { - "model_id": "59de394690804625a29e4657beedffab", "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HTML(value=\"./Fig_6.pdf
\")" - ] + "version_minor": 0, + "model_id": "ce978fbfbd9b4aea9bc15f871c64da80" + } }, "metadata": {}, "output_type": "display_data" @@ -2850,10 +135,7 @@ "end_time": "2024-02-14T11:19:44.850768Z", "start_time": "2024-02-14T11:19:44.847362Z" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } + "collapsed": false }, "outputs": [], "source": [] diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb new file mode 100644 index 000000000..66ddaa947 --- /dev/null +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb @@ -0,0 +1,1955 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b03a1d7a3d3802d6", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "[![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb) \n", + "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "b4ff3463274b433f", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "#### based on Fig. 8 from [Jensen and Nugent (JAS 74) \"_Condensational Growth of Drops Formed on Giant Sea-Salt Aerosol Particles_\"](https://doi.org/10.1175/JAS-D-15-0370.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "initial_id", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T11:39:46.833587Z", + "start_time": "2024-03-22T11:39:46.829389Z" + } + }, + "outputs": [], + "source": [ + "import sys\n", + "if 'google.colab' in sys.modules:\n", + " !pip --quiet install \"open-atmos-jupyter-utils\"\n", + " from open_atmos_jupyter_utils import pip_install_on_colab\n", + " pip_install_on_colab('PySDM-examples>=2.45')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c91b89db396d508c", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-23T11:52:01.383132Z", + "start_time": "2024-03-23T11:51:59.196688Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "from PySDM_examples.Jensen_and_Nugent_2017 import Settings, Simulation\n", + "from open_atmos_jupyter_utils import show_plot\n", + "from PySDM_examples.Jensen_and_Nugent_2017.plotting import figure\n", + "\n", + "settings = Settings(aerosol=\"modified polluted\", cloud_type=\"Sc\")\n", + "simulation = Simulation(settings, gccn=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "846333e445434f6d", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-22T11:40:03.001232Z", + "start_time": "2024-03-22T11:39:53.824734Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "output = simulation.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5503b3380487f50e", + "metadata": { + "ExecuteTime": { + "end_time": "2024-03-23T11:52:14.808782Z", + "start_time": "2024-03-23T11:52:14.490511Z" + }, + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-17T21:21:41.137244\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.1, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6f8a203c020d4574aaec0e810a9ffbd5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HTML(value=\"./Fig_8.pdf
\")" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "masks = figure(\n", + " output=output,\n", + " settings=settings,\n", + " simulation=simulation,\n", + " plot_drops_with_dry_radii_um=(.1, 4.2),\n", + " xlim_r_um=(0, 60),\n", + " xlim_S_percent=(-1, 1),\n", + " return_masks=True\n", + ")\n", + "show_plot(\"Fig_8.pdf\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/plotting.py b/examples/PySDM_examples/Jensen_and_Nugent_2017/plotting.py index 8726e10e0..c798e15f8 100644 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/plotting.py +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/plotting.py @@ -3,6 +3,38 @@ from PySDM.physics import si, in_unit from PySDM.physics.constants import PER_CENT +CLOUD_BASE = 300 * si.m + + +def find_drop_ids_by_dry_size(plot_drops_with_dry_radii_um, simulation_r_dry): + drop_ids = [] + for drop_size_um in plot_drops_with_dry_radii_um: + drop_id = (np.abs(simulation_r_dry - drop_size_um * si.um)).argmin() + drop_ids.append(drop_id) + return drop_ids + + +def compute_table_values(height_above_cb_m, height_cb_m, products, ascent_mask): + """constructing data for Table 4""" + data = {"ascent": [], "descent": []} + for level_idx, height_m in enumerate(products["z"]): + rounded_height_above_cb_m = np.round(height_m - height_cb_m) + if rounded_height_above_cb_m in height_above_cb_m: + r_mean = products["r_mean_act"][level_idx] + r_standard_deviation = products["r_std_act"][level_idx] + r_relative_dispersion = r_standard_deviation / r_mean + + data["ascent" if ascent_mask[level_idx] else "descent"].append( + ( + f"{rounded_height_above_cb_m:.0f}", + f"{in_unit(r_mean, si.um):.2f}", + f"{in_unit(r_standard_deviation, si.um):.2f}", + f"{r_relative_dispersion:.3f}", + ) + ) + data["ascent"].append(data["descent"][0]) + return data + def figure( *, @@ -12,9 +44,9 @@ def figure( plot_drops_with_dry_radii_um, xlim_r_um: tuple, xlim_S_percent: tuple, + return_masks: bool = False, ): - cloud_base = 300 * si.m - y_axis = np.asarray(output["products"]["z"]) - settings.z0 - cloud_base + y_axis = np.asarray(output["products"]["z"]) - settings.z0 - CLOUD_BASE masks = {} if settings.t_end_of_ascent is None: @@ -37,13 +69,13 @@ def figure( color=colors[label], ) axs["S"].set_xlim(*xlim_S_percent) - axs["S"].set_xlabel("S (%)") - axs["S"].legend() + axs["S"].set_xlabel("S (%)", fontsize="15") + axs["S"].legend(fontsize="10") - drop_ids = [] - for drop_size_um in plot_drops_with_dry_radii_um: - drop_id = (np.abs(simulation.r_dry - drop_size_um * si.um)).argmin() - drop_ids.append(drop_id) + drop_ids = find_drop_ids_by_dry_size( + plot_drops_with_dry_radii_um=plot_drops_with_dry_radii_um, + simulation_r_dry=simulation.r_dry, + ) for ( drop_id @@ -65,8 +97,14 @@ def figure( ) axs["r"].legend() axs["r"].set_xlim(*xlim_r_um) - axs["r"].set_xlabel("r$_c$ (µm)") - axs["r"].set_ylabel("height above cloud base (m)") + axs["r"].set_xlabel("r$_c$ (µm)", fontsize="15") + axs["r"].set_ylabel("Height above cloud base (m)", fontsize="15") + # pyplot.xticks(fontsize=12) + # pyplot.yticks(fontsize=12) for ax in axs.values(): ax.grid() + + if return_masks: + return masks + return None diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/settings.py b/examples/PySDM_examples/Jensen_and_Nugent_2017/settings.py index b828b31f1..53dcd457e 100644 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/settings.py +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/settings.py @@ -1,3 +1,5 @@ +from typing import Optional + from pystrict import strict from PySDM import Formulae from PySDM.physics import si @@ -11,19 +13,19 @@ @strict class Settings: - def __init__(self, *, aerosol: str, cloud_type: str): + def __init__(self, *, aerosol: str, cloud_type: str, dt: Optional[float] = None): self.p0 = INITIAL_PRESSURE self.RH0 = INITIAL_RELATIVE_HUMIDITY self.T0 = INITIAL_TEMPERATURE self.z0 = INITIAL_ALTITUDE self.t_end_of_ascent = 1500 * si.s if cloud_type == "Sc" else None - self.dt = 1 * si.s # TODO #1266: not found in the paper yet + self.dt = dt or 1 * si.s # TODO #1266: not found in the paper yet self.kappa = 1.28 # Table 1 from Petters & Kreidenweis 2007 self.formulae = Formulae( saturation_vapour_pressure="FlatauWalkoCotton", # TODO #1266: Bolton - diffusion_kinetics="JensenAndNugent2017", + diffusion_kinetics="GrabowskiEtAl2011", diffusion_thermics="GrabowskiEtAl2011", constants={ # values from appendix B diff --git a/examples/PySDM_examples/Jensen_and_Nugent_2017/simulation.py b/examples/PySDM_examples/Jensen_and_Nugent_2017/simulation.py index e6a71eccd..92e1c0d7b 100644 --- a/examples/PySDM_examples/Jensen_and_Nugent_2017/simulation.py +++ b/examples/PySDM_examples/Jensen_and_Nugent_2017/simulation.py @@ -5,9 +5,16 @@ from PySDM import Builder from PySDM.physics import si from PySDM.backends import CPU -from PySDM.products import PeakSupersaturation, ParcelDisplacement, Time +from PySDM.products import ( + PeakSupersaturation, + ParcelDisplacement, + Time, + ActivatedMeanRadius, + RadiusStandardDeviation, +) from PySDM.environments import Parcel -from PySDM.dynamics import Condensation, AmbientThermodynamics +from PySDM.dynamics import Condensation, AmbientThermodynamics, Coalescence +from PySDM.dynamics.collisions.collision_kernels import Geometric from PySDM.initialisation.sampling.spectral_sampling import Logarithmic # note: 100 in caption of Table 1 @@ -15,7 +22,12 @@ class Simulation(BasicSimulation): - def __init__(self, settings: Settings, gccn: bool = False): + def __init__( + self, + settings: Settings, + gccn: bool = False, + gravitational_coalsecence: bool = False, + ): const = settings.formulae.constants pvs_Celsius = settings.formulae.saturation_vapour_pressure.pvs_Celsius initial_water_vapour_mixing_ratio = const.eps / ( @@ -40,7 +52,7 @@ def __init__(self, settings: Settings, gccn: bool = False): environment=env, ) - additional_derived_attributes = ("radius",) + additional_derived_attributes = ("radius", "equilibrium supersaturation") for additional_derived_attribute in additional_derived_attributes: builder.request_attribute(additional_derived_attribute) @@ -48,6 +60,8 @@ def __init__(self, settings: Settings, gccn: bool = False): AmbientThermodynamics() ) # TODO #1266: order matters here, but error message is not saying it! builder.add_dynamic(Condensation()) + if gravitational_coalsecence: + builder.add_dynamic(Coalescence(collision_kernel=Geometric())) self.r_dry, n_in_unit_volume = Logarithmic( spectrum=settings.dry_radii_spectrum, @@ -80,6 +94,12 @@ def __init__(self, settings: Settings, gccn: bool = False): PeakSupersaturation(name="S_max"), ParcelDisplacement(name="z"), Time(name="t"), + ActivatedMeanRadius( + name="r_mean_act", count_activated=True, count_unactivated=False + ), + RadiusStandardDeviation( + name="r_std_act", count_activated=True, count_unactivated=False + ), ), ) ) @@ -93,7 +113,9 @@ def __init__(self, settings: Settings, gccn: bool = False): def run( self, *, n_steps: int = 2250, steps_per_output_interval: int = 10 ): # TODO #1266: essentially copied from G & P 2023 - output_products = super()._run(n_steps, steps_per_output_interval) + output_products = super()._run( + nt=n_steps, steps_per_output_interval=steps_per_output_interval + ) return {"products": output_products, "attributes": self.output_attributes} def _save(self, output): # TODO #1266: copied from G&P 2023 diff --git a/examples/README.md b/examples/README.md index a89c8265f..f2f432627 100644 --- a/examples/README.md +++ b/examples/README.md @@ -170,14 +170,14 @@ [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb) [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb) [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_1.ipynb) - - Fig. 3: - [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb) - [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb) - [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3.ipynb) - - Fig. 4: - [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb) - [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb) - [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4.ipynb) + - Fig. 3 and Tab. 4 (upper rows): + [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb) + [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb) + [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_3_and_Tab_4_upper_rows.ipynb) + - Fig. 4 and 7, Tab. 4 (bottom rows): + [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_6_bottom_rows.ipynb) + [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_6_bottom_rows.ipynb) + [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_4_and_7_and_Tab_6_bottom_rows.ipynb) - Fig. 5: [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_5.ipynb) [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_5.ipynb) @@ -186,6 +186,10 @@ [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb) [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb) [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_6.ipynb) + - Fig. 8: + [![View notebook](https://img.shields.io/static/v1?label=render%20on&logo=github&color=87ce3e&message=GitHub)](https://github.com/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb) + [![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb) + [![launch on Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/open-atmos/PySDM/blob/main/examples/PySDM_examples/Jensen_and_Nugent_2017/Fig_8.ipynb) ### 0D parcel-model condensation/aqueous-chemistry example: - [Kreidenweis et al. 2003](https://doi.org/10.1029/2002JD002697) (Adiabatic parcel, polydisperse size spectrum, aqueous‐phase SO2 oxidation test case): diff --git a/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_3.py b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_3_and_tab_4_upper_rows.py similarity index 65% rename from tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_3.py rename to tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_3_and_tab_4_upper_rows.py index f5b841b27..480487e71 100644 --- a/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_3.py +++ b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_3_and_tab_4_upper_rows.py @@ -30,7 +30,9 @@ def find_max_alt_index(products): @pytest.fixture(scope="session", name="variables") def variables_fixture(): return notebook_vars( - file=Path(Jensen_and_Nugent_2017.__file__).parent / "Fig_3.ipynb", plot=PLOT + file=Path(Jensen_and_Nugent_2017.__file__).parent + / "Fig_3_and_Tab_4_upper_rows.ipynb", + plot=PLOT, ) @@ -100,6 +102,41 @@ def test_maximal_size_of_largest_droplet(variables): significant=2, ) - -# TODO #1266: radius at -300 m, at ascent top, at cloud base (x2: first pass, end of descent) -# TODO #1266: smoke test for radii in Fig 4 (new file) + @staticmethod + @pytest.mark.parametrize( + "mask_label, height, mr_sw_rd", + ( + ("ascent", 50, (5.28, 0.44, 0.083)), + ("ascent", 100, (6.75, 0.38, 0.057)), + ("ascent", 150, (7.75, 0.36, 0.046)), + ("ascent", 200, (8.54, 0.34, 0.039)), + ("ascent", 250, (9.20, 0.32, 0.035)), + ("ascent", 300, (9.77, 0.31, 0.032)), + ("descent", 300, (9.77, 0.31, 0.032)), + ("descent", 250, (9.23, 0.33, 0.036)), + ("descent", 200, (8.54, 0.36, 0.042)), + ("descent", 150, (7.80, 0.39, 0.051)), + ("descent", 100, (6.82, 0.45, 0.066)), + ("descent", 50, (5.43, 0.57, 0.105)), + ), + ) + def test_table_4_upper_rows(variables, mask_label, height, mr_sw_rd): + # arrange + tolerance = 0.075 + mean_radius, spectral_width, relative_dispersion = mr_sw_rd + + # act + actual = variables["table_values"] + + # assert + for row in actual[mask_label]: + if int(row[0]) == height: + np.testing.assert_allclose( + actual=float(row[1]), desired=mean_radius, rtol=tolerance + ) + np.testing.assert_allclose( + actual=float(row[2]), desired=spectral_width, rtol=tolerance + ) + np.testing.assert_allclose( + actual=float(row[3]), desired=relative_dispersion, rtol=tolerance + ) diff --git a/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_4_and_7_and_tab_4_bottom_rows.py b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_4_and_7_and_tab_4_bottom_rows.py new file mode 100644 index 000000000..9799e3ead --- /dev/null +++ b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_4_and_7_and_tab_4_bottom_rows.py @@ -0,0 +1,179 @@ +# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring +from pathlib import Path +import numpy as np +import pytest +from scipy import signal +from PySDM_examples.utils import notebook_vars +from PySDM_examples import Jensen_and_Nugent_2017 +from PySDM.physics.constants import PER_CENT +from PySDM.physics import si +from .test_fig_3_and_tab_4_upper_rows import find_cloud_base_index, find_max_alt_index + +PLOT = False +N_SD = Jensen_and_Nugent_2017.simulation.N_SD_NON_GCCN + np.count_nonzero( + Jensen_and_Nugent_2017.table_3.NA +) + + +@pytest.fixture(scope="session", name="variables") +def variables_fixture(): + return notebook_vars( + file=Path(Jensen_and_Nugent_2017.__file__).parent + / "Fig_4_and_7_and_Tab_4_bottom_rows.ipynb", + plot=PLOT, + ) + + +class TestFig4And7: + @staticmethod + def test_height_range(variables): + """note: in the plot the y-axis has cloud-base height subtracted, here not""" + z_minus_z0 = ( + np.asarray(variables["output"]["products"]["z"]) - variables["settings"].z0 + ) + epsilon = 1 * si.m + assert 0 <= min(z_minus_z0) < max(z_minus_z0) < 600 * si.m + epsilon + + @staticmethod + def test_cloud_base_height(variables): + cloud_base_index = find_cloud_base_index(variables["output"]["products"]) + z0 = variables["settings"].z0 + assert ( + 290 * si.m + < variables["output"]["products"]["z"][cloud_base_index] - z0 + < 300 * si.m + ) + + @staticmethod + def test_supersaturation_maximum(variables): + supersaturation = np.asarray(variables["output"]["products"]["S_max"]) + assert signal.argrelextrema(supersaturation, np.greater)[0].shape[0] == 1 + assert 0.4 * PER_CENT < np.nanmax(supersaturation) < 0.5 * PER_CENT + + class TestFig4: + + @staticmethod + @pytest.mark.parametrize( + "drop_id, activated, grow_on_descent", + ( + [(drop_id, False, False) for drop_id in range(0, int(0.15 * N_SD))] + + [ + (drop_id, True, False) + for drop_id in range(int(0.25 * N_SD), int(0.6 * N_SD)) + ] + + [(drop_id, True, True) for drop_id in range(int(0.777 * N_SD), N_SD)] + ), + ) + def test_grow_vs_evaporation_on_descent( + variables, drop_id, activated, grow_on_descent + ): + # arrange + cb_idx = find_cloud_base_index(variables["output"]["products"]) + ma_idx = find_max_alt_index(variables["output"]["products"]) + radii = variables["output"]["attributes"]["radius"][drop_id] + r1 = radii[0] + r2 = radii[cb_idx] + r3 = radii[ma_idx] + r4 = radii[-1] + + activated_actual = r1 < r2 < r3 + assert activated == activated_actual + + if grow_on_descent: + assert r3 < r4 + else: + assert r3 > r4 + + @staticmethod + def test_maximal_size_of_largest_droplet(variables): + np.testing.assert_approx_equal( + max(variables["output"]["attributes"]["radius"][-1]), + 57 * si.um, + significant=2, + ) + + @staticmethod + def test_initial_size_of_largest_droplet(variables): + np.testing.assert_approx_equal( + min(variables["output"]["attributes"]["radius"][-1]), + 19 * si.um, + significant=2, + ) + + class TestFig7: # pylint: disable=too-few-public-methods + @staticmethod + @pytest.mark.parametrize( + "mask_label, var, dry_radius_um, value_range", + ( + ("ascent", "SS_eq", 0.1, (0, 0.1 * PER_CENT)), + ("ascent", "SS_eq", 2, (-0.75 * PER_CENT, 0)), + ("ascent", "SS_eq", 9, (-2.01 * PER_CENT, -0.6 * PER_CENT)), + ("descent", "SS_eq", 0.1, (0, 0.1 * PER_CENT)), + ("descent", "SS_eq", 2, (-0.75 * PER_CENT, 0)), + ("descent", "SS_eq", 9, (-1 * PER_CENT, -0.25 * PER_CENT)), + ("ascent", "SS_ef", 0.1, (0, 0.5 * PER_CENT)), + ("ascent", "SS_ef", 2, (0, 1 * PER_CENT)), + ("ascent", "SS_ef", 9, (0.75 * PER_CENT, 2.5 * PER_CENT)), + ("descent", "SS_ef", 0.1, (-0.2 * PER_CENT, 0.1 * PER_CENT)), + ("descent", "SS_ef", 2, (-0.5 * PER_CENT, 0.25 * PER_CENT)), + ("descent", "SS_ef", 9, (0.3 * PER_CENT, 0.8 * PER_CENT)), + ), + ) + def test_equilibrium_supersaturation( + variables, *, mask_label, var, dry_radius_um, value_range + ): + mask = np.logical_and( + variables["masks"][mask_label], variables["height_above_cloud_base"] > 0 + ) + assert (variables[var][dry_radius_um][mask] > value_range[0]).all() + assert (variables[var][dry_radius_um][mask] < value_range[1]).all() + + class TestTable4bottom: # pylint: disable=too-few-public-methods + + @staticmethod + @pytest.mark.parametrize( + "mask_label, height, mr_sw_rd", + ( + ("ascent", 50, (5.26, 0.45, 0.093)), + ("ascent", 100, (6.73, 0.45, 0.066)), + ("ascent", 150, (7.73, 0.43, 0.055)), + ("ascent", 200, (8.52, 0.41, 0.048)), + ("ascent", 250, (9.19, 0.41, 0.044)), + ("ascent", 300, (9.77, 0.40, 0.041)), + ("descent", 300, (9.77, 0.40, 0.041)), + ("descent", 250, (9.21, 0.43, 0.047)), + ("descent", 200, (8.56, 0.46, 0.054)), + ("descent", 150, (7.78, 0.51, 0.065)), + ("descent", 100, (6.79, 0.57, 0.084)), + ("descent", 50, (5.38, 0.69, 0.129)), + ), + ) + def test_table_4_bottom_rows( + variables, + mask_label, + height, + mr_sw_rd, + ): + # arrange + tolerance = 0.2 + mean_radius, spectral_width, relative_dispersion = mr_sw_rd + + # act + actual = variables["table_values"] + + # assert + for row in actual[mask_label]: + if int(row[0]) == height: + np.testing.assert_allclose( + actual=float(row[1]), desired=mean_radius, rtol=tolerance + ) + np.testing.assert_allclose( + actual=float(row[2]), + desired=spectral_width, + rtol=tolerance, + ) + np.testing.assert_allclose( + actual=float(row[3]), + desired=relative_dispersion, + rtol=tolerance, + ) diff --git a/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_4.py b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_5.py similarity index 78% rename from tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_4.py rename to tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_5.py index 157f4f8ed..a2b8bccfb 100644 --- a/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_4.py +++ b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_5.py @@ -9,8 +9,11 @@ from PySDM_examples.utils import notebook_vars from PySDM_examples import Jensen_and_Nugent_2017 from PySDM.physics.constants import PER_CENT - from PySDM.physics import si +from .test_fig_4_and_7_and_tab_4_bottom_rows import ( + find_cloud_base_index, + find_max_alt_index, +) PLOT = False N_SD = Jensen_and_Nugent_2017.simulation.N_SD_NON_GCCN + np.count_nonzero( @@ -18,27 +21,14 @@ ) -def find_cloud_base_index(products): - cloud_base_index = -1 - for index, value in enumerate(products["S_max"]): - if value > 0: - cloud_base_index = index - break - return cloud_base_index - - -def find_max_alt_index(products): - return np.argmax(products["z"]) - - @pytest.fixture(scope="session", name="variables") def variables_fixture(): return notebook_vars( - file=Path(Jensen_and_Nugent_2017.__file__).parent / "Fig_4.ipynb", plot=PLOT + file=Path(Jensen_and_Nugent_2017.__file__).parent / "Fig_5.ipynb", plot=PLOT ) -class TestFig4: +class TestFig5: @staticmethod def test_height_range(variables): """note: in the plot the y-axis has cloud-base height subtracted, here not""" @@ -60,13 +50,14 @@ def test_cloud_base_height(variables): ) @staticmethod + @pytest.mark.xfail(strict=True, reason="TODO #1266") def test_supersaturation_maximum(variables): supersaturation = np.asarray(variables["output"]["products"]["S_max"]) assert signal.argrelextrema(supersaturation, np.greater)[0].shape[0] == 1 - assert 0.35 * PER_CENT < np.nanmax(supersaturation) < 0.5 * PER_CENT + assert 1.2 * PER_CENT < np.nanmax(supersaturation) < 1.4 * PER_CENT @staticmethod - @pytest.mark.parametrize("drop_id", range(int(0.777 * N_SD), N_SD)) + @pytest.mark.parametrize("drop_id", range(int(0.8 * N_SD), N_SD)) def test_radii(variables, drop_id): """checks that the largest aerosol activate and still grow upon descent""" # arrange @@ -81,3 +72,11 @@ def test_radii(variables, drop_id): assert r1 < r2 < r3 assert r3 < r4 + + @staticmethod + def test_maximal_size_of_largest_droplet(variables): + np.testing.assert_approx_equal( + max(variables["output"]["attributes"]["radius"][-1]), + 56 * si.um, + significant=2, + ) diff --git a/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_6.py b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_6.py new file mode 100644 index 000000000..2a0445ecc --- /dev/null +++ b/tests/smoke_tests/parcel_c/jensen_and_nugent_2017/test_fig_6.py @@ -0,0 +1,80 @@ +# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring + +from pathlib import Path + +import numpy as np +import pytest +from scipy import signal + +from PySDM_examples.utils import notebook_vars +from PySDM_examples import Jensen_and_Nugent_2017 +from PySDM.physics.constants import PER_CENT +from PySDM.physics import si +from .test_fig_4_and_7_and_tab_4_bottom_rows import ( + find_cloud_base_index, + find_max_alt_index, +) + +PLOT = False +N_SD = Jensen_and_Nugent_2017.simulation.N_SD_NON_GCCN + np.count_nonzero( + Jensen_and_Nugent_2017.table_3.NA +) + + +@pytest.fixture(scope="session", name="variables") +def variables_fixture(): + return notebook_vars( + file=Path(Jensen_and_Nugent_2017.__file__).parent / "Fig_6.ipynb", plot=PLOT + ) + + +class TestFig6: + @staticmethod + def test_height_range(variables): + """note: in the plot the y-axis has cloud-base height subtracted, here not""" + z_minus_z0 = ( + np.asarray(variables["output"]["products"]["z"]) - variables["settings"].z0 + ) + epsilon = 1 * si.m + assert 0 <= min(z_minus_z0) < max(z_minus_z0) < 1850 * si.m + epsilon + + @staticmethod + def test_cloud_base_height(variables): + cloud_base_index = find_cloud_base_index(variables["output"]["products"]) + + z0 = variables["settings"].z0 + assert ( + 290 * si.m + < variables["output"]["products"]["z"][cloud_base_index] - z0 + < 310 * si.m + ) + + @staticmethod + def test_supersaturation_maximum(variables): + supersaturation = np.asarray(variables["output"]["products"]["S_max"]) + extrema = signal.argrelextrema(supersaturation, np.greater, order=12) + assert extrema[0].shape[0] == 1 + assert 1.2 * PER_CENT < np.nanmax(supersaturation) < 1.3 * PER_CENT + + @staticmethod + @pytest.mark.parametrize("drop_id", range(int(0.77 * N_SD), N_SD)) + def test_radii(variables, drop_id): + """checks that the largest aerosol activate and still grow upon descent""" + # arrange + cb_idx = find_cloud_base_index(variables["output"]["products"]) + ma_idx = find_max_alt_index(variables["output"]["products"]) + + radii = variables["output"]["attributes"]["radius"][drop_id] + r1 = radii[0] + r2 = radii[cb_idx] + r3 = radii[ma_idx] + + assert r1 < r2 < r3 + + @staticmethod + def test_maximal_size_of_largest_droplet(variables): + np.testing.assert_approx_equal( + max(variables["output"]["attributes"]["radius"][-1]), + 50 * si.um, + significant=2, + ) diff --git a/tests/unit_tests/physics/test_saturation_vapour_pressure.py b/tests/unit_tests/physics/test_saturation_vapour_pressure.py index ff116a281..317984ab2 100644 --- a/tests/unit_tests/physics/test_saturation_vapour_pressure.py +++ b/tests/unit_tests/physics/test_saturation_vapour_pressure.py @@ -1,5 +1,6 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import inspect +import pytest import numpy as np from matplotlib import pyplot @@ -7,61 +8,90 @@ from PySDM import Formulae from PySDM.formulae import _choices from PySDM.physics import constants_defaults as const -from PySDM.physics import saturation_vapour_pressure +from PySDM.physics import saturation_vapour_pressure, si -def test_saturation_vapour_pressure(plot=False): - # Arrange - choices = _choices(saturation_vapour_pressure) - formulae = {k: Formulae(saturation_vapour_pressure=k) for k in choices} - temperature = np.linspace(-0.2, 0.4) +class TestSaturationVapourPressure: + @staticmethod + def test_saturation_vapour_pressure(plot=False): + # Arrange + choices = _choices(saturation_vapour_pressure) + formulae = {k: Formulae(saturation_vapour_pressure=k) for k in choices} + temperature = np.linspace(-0.2, 0.4) - # Plot - pyplot.axhline(const.p_tri, label="triple point", color="red") - pyplot.axvline(const.T_tri - const.T0, color="red") - for key, val in formulae.items(): - for name, func in inspect.getmembers(val.saturation_vapour_pressure): - if name[:2] not in ("__", "a_"): - if not (key == "AugustRocheMagnus" and name == "ice_Celsius"): - pyplot.plot(temperature, func(temperature), label=f"{key}::{name}") - pyplot.grid() - pyplot.legend() - pyplot.xlabel("T [C]") - pyplot.ylabel("p [Pa]") - if plot: - pyplot.show() + # Plot + pyplot.axhline(const.p_tri, label="triple point", color="red") + pyplot.axvline(const.T_tri - const.T0, color="red") + for key, val in formulae.items(): + for name, func in inspect.getmembers(val.saturation_vapour_pressure): + if name[:2] not in ("__", "a_"): + if not ( + key in ("AugustRocheMagnus", "Wexler1976", "Bolton1980") + and name == "ice_Celsius" + ): + pyplot.plot( + temperature, func(temperature), label=f"{key}::{name}" + ) + pyplot.grid() + pyplot.legend() + pyplot.xlabel("T [C]") + pyplot.ylabel("p [Pa]") + if plot: + pyplot.show() - # Assert - temperature = np.linspace(-20, 20, 100) - choices_keys = tuple(choices.keys()) - for choice in choices_keys[1:]: - np.testing.assert_allclose( - Formulae( - saturation_vapour_pressure=choices_keys[0] - ).saturation_vapour_pressure.pvs_Celsius(temperature), - Formulae( - saturation_vapour_pressure=choice - ).saturation_vapour_pressure.pvs_Celsius(temperature), - rtol=2e-2, - ) - - for choice in choices_keys[1:]: - if choice != "AugustRocheMagnus": - temperature = np.linspace(-20, 0, 100) - np.testing.assert_array_less( - Formulae( - saturation_vapour_pressure="FlatauWalkoCotton" - ).saturation_vapour_pressure.ice_Celsius(temperature), + # Assert + temperature = np.linspace(-20, 20, 100) + choices_keys = tuple(choices.keys()) + for choice in choices_keys[1:]: + np.testing.assert_allclose( Formulae( - saturation_vapour_pressure=choice - ).saturation_vapour_pressure.pvs_Celsius(temperature), - ) - temperature = np.linspace(1, 1, 100) - np.testing.assert_array_less( - Formulae( - saturation_vapour_pressure="FlatauWalkoCotton" + saturation_vapour_pressure=choices_keys[0] ).saturation_vapour_pressure.pvs_Celsius(temperature), Formulae( saturation_vapour_pressure=choice - ).saturation_vapour_pressure.ice_Celsius(temperature), + ).saturation_vapour_pressure.pvs_Celsius(temperature), + rtol=2e-2, ) + + for choice in choices_keys[1:]: + if not choice in ("AugustRocheMagnus", "Bolton1980", "Wexler1976"): + temperature = np.linspace(-20, 0, 100) + np.testing.assert_array_less( + Formulae( + saturation_vapour_pressure="FlatauWalkoCotton" + ).saturation_vapour_pressure.ice_Celsius(temperature), + Formulae( + saturation_vapour_pressure=choice + ).saturation_vapour_pressure.pvs_Celsius(temperature), + ) + temperature = np.linspace(1, 1, 100) + np.testing.assert_array_less( + Formulae( + saturation_vapour_pressure="FlatauWalkoCotton" + ).saturation_vapour_pressure.pvs_Celsius(temperature), + Formulae( + saturation_vapour_pressure=choice + ).saturation_vapour_pressure.ice_Celsius(temperature), + ) + + @staticmethod + @pytest.mark.parametrize( + "T_C, expected_es_mb", + ( + (-40, 0.1905), + (-30, 0.5106), + (-20, 1.2563), + (-10, 2.8657), + (0, 6.1121), + (10, 12.279), + (20, 23.385), + (30, 42.452), + (40, 73.813), + ), + ) + def test_wexler_1976_table_1(T_C, expected_es_mb): + formulae = Formulae(saturation_vapour_pressure="Wexler1976") + actual_es = formulae.saturation_vapour_pressure.pvs_Celsius(T_C) + np.testing.assert_approx_equal( + actual=actual_es, desired=expected_es_mb * si.mbar, significant=4 + )