From 428e796788e113383df508d3659ea62c25790baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Mon, 19 May 2025 23:17:43 +0200 Subject: [PATCH 01/26] add Bolot 2013 formula for kinetic fract. factor --- .../__init__.py | 1 + .../bolot_et_al_2013.py | 46 +++++++++++++++++++ docs/bibliography.json | 3 +- 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py b/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py index cc26e74a89..c91897f53b 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py @@ -5,3 +5,4 @@ from PySDM.impl.null_physics_class import Null from .jouzel_and_merlivat_1984 import JouzelAndMerlivat1984 from .craig_gordon import CraigGordon +from .bolot_et_al_2013 import BolotEtAl2013 diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py b/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py new file mode 100644 index 0000000000..49e78baf17 --- /dev/null +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py @@ -0,0 +1,46 @@ +""" +kinetic fractionation factor from [Bolot et al. 2013](https://doi.org/10.5194/acp-13-7903-2013) +eq. (1) with subsequent variable definitions on pages 7906 and 7907 and in Appendix (A6, A6). +In the paper, alpha_kinetic is probably actually alpha_effective +(contains alpha_equilibrium in numerator). +q_sat_inf in Bolot eq (A7) is substituted with equivalent form of (1/S * rho_v_inf/rho_[l,i]_inf). +""" + +from .jouzel_and_merlivat_1984 import JouzelAndMerlivat1984 + + +class BolotEtAl2013(JouzelAndMerlivat1984): + def __init__(self, _): + pass + + @staticmethod + def transfer_coefficient_liq_to_ice( + const, + diffusion_ventilation_coefficient, + condensed_water_density, + # mass_ventilation_coefficient, + # heat_ventilation_coefficient, + pvs, + molar_mass, + temperature, + relative_humidity, + r_dr_dt_assuming_RHeq0, + ): # pylint: disable=too-many-arguments + """ + Temperature is in 'infinity' T_inf; + For exact formula from Bolot et al. 2013 use `r_dr_dt` from Mason 1971 + assuming `RH_eq` equal to zero and putting + `K * heat_ventilation_coefficient / mass_ventilation_coefficient` + instead of `K`. + """ + return 1 / ( + r_dr_dt_assuming_RHeq0 + * condensed_water_density + / relative_humidity + / diffusion_ventilation_coefficient + * (const.R_str * temperature / molar_mass / pvs) + ) + + @staticmethod + def effective_supersaturation(transfer_coefficient_liq_to_ice, relative_humidity): + return 1 / (1 - transfer_coefficient_liq_to_ice * (1 - 1 / relative_humidity)) diff --git a/docs/bibliography.json b/docs/bibliography.json index 505e225906..9c2f246ab3 100644 --- a/docs/bibliography.json +++ b/docs/bibliography.json @@ -526,7 +526,8 @@ "https://doi.org/10.5194/acp-13-7903-2013": { "usages": [ "examples/PySDM_examples/Bolot_et_al_2013/__init__.py", - "tests/unit_tests/physics/test_isotope_equilibrium_fractionation_factors.py" + "tests/unit_tests/physics/test_isotope_equilibrium_fractionation_factors.py", + "PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py" ], "label": "Bolot et al. 2013 (Atmos. Chem. Phys. 13)", "title": "Modelling and interpreting the isotopic composition of water vapour in convective updrafts " From 41e3acf332691771a582f5241eb28137cdfb7fac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 4 Jun 2025 15:27:47 +0200 Subject: [PATCH 02/26] clean up functions; add test checking n --- PySDM/physics/drop_growth/howell_1949.py | 12 +++- .../bolot_et_al_2013.py | 40 +++++-------- ...t_isotope_kinetic_fractionation_factors.py | 58 +++++++++++++++++++ 3 files changed, 84 insertions(+), 26 deletions(-) diff --git a/PySDM/physics/drop_growth/howell_1949.py b/PySDM/physics/drop_growth/howell_1949.py index 617398ff7b..63a29a952d 100644 --- a/PySDM/physics/drop_growth/howell_1949.py +++ b/PySDM/physics/drop_growth/howell_1949.py @@ -14,7 +14,17 @@ class Howell1949(Fick): # pylint: disable=too-few-public-methods @staticmethod def Fk(const, T, K, lv): - """thermodynamic term associated with heat conduction""" + """Thermodynamic term associated with heat conduction. + + Parameters + ---------- + T + Temperature in Kelvins. + K + Thermal diffusivity with heat ventilation factor. + lv + Latent heat of evaporation or sublimation. + """ return const.rho_w * lv / T / K * (lv / T / const.Rv) @staticmethod diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py b/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py index 49e78baf17..9f43882272 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py @@ -14,32 +14,22 @@ def __init__(self, _): pass @staticmethod - def transfer_coefficient_liq_to_ice( - const, - diffusion_ventilation_coefficient, - condensed_water_density, - # mass_ventilation_coefficient, - # heat_ventilation_coefficient, - pvs, - molar_mass, - temperature, - relative_humidity, - r_dr_dt_assuming_RHeq0, - ): # pylint: disable=too-many-arguments - """ - Temperature is in 'infinity' T_inf; - For exact formula from Bolot et al. 2013 use `r_dr_dt` from Mason 1971 - assuming `RH_eq` equal to zero and putting - `K * heat_ventilation_coefficient / mass_ventilation_coefficient` - instead of `K`. + def transfer_coefficient_liq_to_ice(D, Fk): + """eq. (A6) in Bolot. + + Parameters + ---------- + D + light isotope diffusion coefficient + Fk + term associated with heat transfer + + Returns + ---------- + A_li + liquid to ice transfer coefficient """ - return 1 / ( - r_dr_dt_assuming_RHeq0 - * condensed_water_density - / relative_humidity - / diffusion_ventilation_coefficient - * (const.R_str * temperature / molar_mass / pvs) - ) + return 1 / (1 + D * Fk) @staticmethod def effective_supersaturation(transfer_coefficient_liq_to_ice, relative_humidity): diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index fa8f0caf61..95386c27d8 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -5,12 +5,15 @@ import numpy as np import pytest from matplotlib import pyplot +from open_atmos_jupyter_utils import show_plot from PySDM import Formulae from PySDM import physics from PySDM.physics.dimensional_analysis import DimensionalAnalysis from PySDM.physics.isotope_kinetic_fractionation_factors import JouzelAndMerlivat1984 +PLOT = False + class TestIsotopeKineticFractionationFactors: @staticmethod @@ -114,3 +117,58 @@ def test_fig9_values(temperature_C, saturation, alpha): # assert np.testing.assert_approx_equal(actual=sut, desired=alpha, significant=3) + + @staticmethod + @pytest.mark.parametrize("isotope", ("2H", "18O", "17O")) + def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon(isotope, plot=PLOT): + # arrange + T = 273 + RH = np.linspace(0.3, 1) + formulae = Formulae( + isotope_equilibrium_fractionation_factors="VanHook1968", + isotope_diffusivity_ratios="HellmannAndHarvey2020", + isotope_kinetic_fractionation_factors="JouzelAndMerlivat1984", + ) + Si = formulae.saturation_vapour_pressure.pvs_ice(T) + alpha_eq = getattr( + formulae.isotope_equilibrium_fractionation_factors, f"alpha_l_{isotope}" + )(T) + D_heavy_to_light = getattr( + formulae.isotope_diffusivity_ratios, f"ratio_{isotope}_heavy_to_light" + )(T) + alpha_kin_jm = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic( + alpha_equilibrium=alpha_eq, + saturation_over_ice=Si, + diffusivity_ratio_heavy_to_light=D_heavy_to_light, + ) + formulae = Formulae( + isotope_equilibrium_fractionation_factors="VanHook1968", + isotope_diffusivity_ratios="HellmannAndHarvey2020", + isotope_kinetic_fractionation_factors="CraigGordon", + ) + alpha_kin_cg = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic( + relative_humidity=RH, + turbulence_parameter_n=1, + delta_diff=alpha_eq - 1, + theta=1, + ) + + # act + n = (alpha_kin_jm + 1) / (alpha_kin_cg + 1) + + # plot + pyplot.plot(1 - RH, n) + pyplot.gca().set( + xlabel="1-RH", + ylabel="turbulence parameter n", + ) + pyplot.grid() + + if plot: + show_plot() + else: + pyplot.clf() + + # assert + np.testing.assert_equal(n > 0.5, True) + np.testing.assert_equal(n < 1, True) From f81c961b8648cc290a0e45b1a7bfdfeaff02ad11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 4 Jun 2025 16:38:41 +0200 Subject: [PATCH 03/26] remove Bolot formula as it is defined in Jouzel & Merlivat --- .../__init__.py | 1 - .../bolot_et_al_2013.py | 36 ---------- .../jouzel_and_merlivat_1984.py | 69 ++++++++++++++++--- 3 files changed, 58 insertions(+), 48 deletions(-) delete mode 100644 PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py b/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py index 989573ee5c..b3f96b4aa7 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/__init__.py @@ -4,5 +4,4 @@ from PySDM.impl.null_physics_class import Null from .craig_gordon import CraigGordon -from .bolot_et_al_2013 import BolotEtAl2013 from .jouzel_and_merlivat_1984 import JouzelAndMerlivat1984 diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py b/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py deleted file mode 100644 index 9f43882272..0000000000 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -kinetic fractionation factor from [Bolot et al. 2013](https://doi.org/10.5194/acp-13-7903-2013) -eq. (1) with subsequent variable definitions on pages 7906 and 7907 and in Appendix (A6, A6). -In the paper, alpha_kinetic is probably actually alpha_effective -(contains alpha_equilibrium in numerator). -q_sat_inf in Bolot eq (A7) is substituted with equivalent form of (1/S * rho_v_inf/rho_[l,i]_inf). -""" - -from .jouzel_and_merlivat_1984 import JouzelAndMerlivat1984 - - -class BolotEtAl2013(JouzelAndMerlivat1984): - def __init__(self, _): - pass - - @staticmethod - def transfer_coefficient_liq_to_ice(D, Fk): - """eq. (A6) in Bolot. - - Parameters - ---------- - D - light isotope diffusion coefficient - Fk - term associated with heat transfer - - Returns - ---------- - A_li - liquid to ice transfer coefficient - """ - return 1 / (1 + D * Fk) - - @staticmethod - def effective_supersaturation(transfer_coefficient_liq_to_ice, relative_humidity): - return 1 / (1 - transfer_coefficient_liq_to_ice * (1 - 1 / relative_humidity)) diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index 5dd9f9e1bd..a49579247c 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -1,6 +1,8 @@ """ -kinetic fractionation factor from [Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749) -(as eq. 3e for n=1 in [Stewart 1975](https://doi.org/10.1029/JC080i009p01133)) +kinetic fractionation factor for liquid and ice from [Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749), +as eq. 3e for n=1 in [Stewart 1975](https://doi.org/10.1029/JC080i009p01133) +and eq. 1 in [Bolot 2013](https://doi.org/10.5194/acp-13-7903-2013), +where alpha_kinetic is multiplied by alpha equilibrium (eq. 1 defines effective alpha). """ @@ -9,13 +11,58 @@ def __init__(self, _): pass @staticmethod - def alpha_kinetic( - alpha_equilibrium, saturation_over_ice, diffusivity_ratio_heavy_to_light - ): - """eq. (11)""" - return saturation_over_ice / ( - alpha_equilibrium - / diffusivity_ratio_heavy_to_light - * (saturation_over_ice - 1) - + 1 + def alpha_kinetic(alpha_equilibrium, saturation, D_ratio_heavy_to_light): + """eq. (11) + + Parameters + ---------- + alpha_equilibrium + Equilibrium fractionation factor. + saturation + Over liquid water or ice. + D_ratio_heavy_to_light + Diffusivity ratio for heavy to light isotope. + + Returns + ---------- + alpha_kinetic + Kinetic fractionation factor for liquid water or ice.""" + return saturation / ( + alpha_equilibrium / D_ratio_heavy_to_light * (saturation - 1) + 1 ) + + @staticmethod + def transfer_coefficient(D, Fk): + """ + eq. (A4) in Jouzel & Merlivat 1984, + eq. (A6) in Bolot 2013. + + Parameters + ---------- + D + Diffusion coefficient for light isotope. + Fk + Term associated with heat transfer. + + Returns + ---------- + Thermal transfer coefficient between water vapour and condensate. + """ + return 1 / (1 + D * Fk) + + @staticmethod + def effective_saturation(transfer_coefficient, RH): + """ + + Parameters + ---------- + transfer_coefficient + Thermal transfer coefficient between water vapour and condensate (liquid water or ice). + RH + Relative humidity. + + Returns + ---------- + Effective vapour saturation over liquid water or ice. + """ + return 1 / (1 - transfer_coefficient * (1 - 1 / RH)) From b0590ca6dadd48f60c2549475e72a5ba8c51b31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 4 Jun 2025 16:44:33 +0200 Subject: [PATCH 04/26] update signatures --- .../jouzel_and_merlivat_1984.py | 3 ++- docs/bibliography.json | 4 ++-- ...st_isotope_kinetic_fractionation_factors.py | 18 ++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index a49579247c..8b2a9dbc12 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -1,5 +1,6 @@ """ -kinetic fractionation factor for liquid and ice from [Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749), +kinetic fractionation factor for liquid and ice from +[Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749), as eq. 3e for n=1 in [Stewart 1975](https://doi.org/10.1029/JC080i009p01133) and eq. 1 in [Bolot 2013](https://doi.org/10.5194/acp-13-7903-2013), where alpha_kinetic is multiplied by alpha equilibrium (eq. 1 defines effective alpha). diff --git a/docs/bibliography.json b/docs/bibliography.json index 5706be1b5c..b757bd31ab 100644 --- a/docs/bibliography.json +++ b/docs/bibliography.json @@ -528,8 +528,8 @@ "https://doi.org/10.5194/acp-13-7903-2013": { "usages": [ "examples/PySDM_examples/Bolot_et_al_2013/__init__.py", - "tests/unit_tests/physics/test_isotope_equilibrium_fractionation_factors.py", - "PySDM/physics/isotope_kinetic_fractionation_factors/bolot_et_al_2013.py" + "PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py", + "tests/unit_tests/physics/test_isotope_equilibrium_fractionation_factors.py" ], "label": "Bolot et al. 2013 (Atmos. Chem. Phys. 13)", "title": "Modelling and interpreting the isotopic composition of water vapour in convective updrafts " diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 95386c27d8..80b419885b 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -28,8 +28,8 @@ def test_units(): # act sut = JouzelAndMerlivat1984.alpha_kinetic( alpha_equilibrium=alpha_eq, - diffusivity_ratio_heavy_to_light=D_ratio, - saturation_over_ice=saturation_over_ice, + D_ratio_heavy_to_light=D_ratio, + saturation=saturation_over_ice, ) # assert @@ -57,10 +57,8 @@ def test_fig_9_from_jouzel_and_merlivat_1984(plot=False): alpha_k = { temperature: sut( alpha_equilibrium=alpha_s[temperature], - saturation_over_ice=saturation, - diffusivity_ratio_heavy_to_light=diffusivity_ratio_heavy_to_light( - temperature - ), + saturation=saturation, + D_ratio_heavy_to_light=diffusivity_ratio_heavy_to_light(temperature), ) for temperature in temperatures } @@ -108,8 +106,8 @@ def test_fig9_values(temperature_C, saturation, alpha): alpha_s = formulae.isotope_equilibrium_fractionation_factors.alpha_i_18O(T) alpha_k = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic( alpha_equilibrium=alpha_s, - saturation_over_ice=saturation, - diffusivity_ratio_heavy_to_light=diffusivity_ratio_18O(T), + saturation=saturation, + D_ratio_heavy_to_light=diffusivity_ratio_18O(T), ) # act @@ -138,8 +136,8 @@ def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon(isotope, plot=PLOT): )(T) alpha_kin_jm = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic( alpha_equilibrium=alpha_eq, - saturation_over_ice=Si, - diffusivity_ratio_heavy_to_light=D_heavy_to_light, + saturation=Si, + D_ratio_heavy_to_light=D_heavy_to_light, ) formulae = Formulae( isotope_equilibrium_fractionation_factors="VanHook1968", From f66f3cf22e69740d18b6e6c07bcd3b56c326890c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 4 Jun 2025 17:10:55 +0200 Subject: [PATCH 05/26] add units tests --- ...t_isotope_kinetic_fractionation_factors.py | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 80b419885b..f2cb0e4541 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -17,7 +17,7 @@ class TestIsotopeKineticFractionationFactors: @staticmethod - def test_units(): + def test_units_alpha_kinetic(): """checks that alphas are dimensionless""" with DimensionalAnalysis(): # arrange @@ -35,6 +35,34 @@ def test_units(): # assert assert sut.check("[]") + @staticmethod + def test_units_transfer_coefficient(): + with DimensionalAnalysis(): + # arrange + D = 1 * physics.si.m**2 / physics.si.s + Fk = 1 * physics.si.s / physics.si.m**2 + + # act + sut = JouzelAndMerlivat1984.transfer_coefficient(D=D, Fk=Fk) + + # assert + assert sut.check("[]") + + @staticmethod + def test_units_eff_saturation(): + with DimensionalAnalysis(): + # arrange + transfer_coeff = 1 * physics.si.dimensionless + relative_humidity = 1 * physics.si.dimensionless + + # act + sut = JouzelAndMerlivat1984.effective_saturation( + transfer_coefficient=transfer_coeff, RH=relative_humidity + ) + + # assert + assert sut.check("[]") + @staticmethod def test_fig_9_from_jouzel_and_merlivat_1984(plot=False): """[Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749)""" @@ -118,9 +146,12 @@ def test_fig9_values(temperature_C, saturation, alpha): @staticmethod @pytest.mark.parametrize("isotope", ("2H", "18O", "17O")) - def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon(isotope, plot=PLOT): + @pytest.mark.parametrize("temperature_C", (-30, -20, -1)) + def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon( + isotope, temperature_C, plot=PLOT + ): # arrange - T = 273 + T = Formulae().trivia.C2K(temperature_C) RH = np.linspace(0.3, 1) formulae = Formulae( isotope_equilibrium_fractionation_factors="VanHook1968", @@ -140,8 +171,6 @@ def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon(isotope, plot=PLOT): D_ratio_heavy_to_light=D_heavy_to_light, ) formulae = Formulae( - isotope_equilibrium_fractionation_factors="VanHook1968", - isotope_diffusivity_ratios="HellmannAndHarvey2020", isotope_kinetic_fractionation_factors="CraigGordon", ) alpha_kin_cg = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic( From 1bf0b8cf31a069fcb8d9d15a6c226d13a9f5d657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 4 Jun 2025 23:51:14 +0200 Subject: [PATCH 06/26] after @slayoo review :) --- PySDM/physics/drop_growth/howell_1949.py | 2 +- .../jouzel_and_merlivat_1984.py | 3 +-- examples/PySDM_examples/Fisher_1991/fig_2.ipynb | 2 +- examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb | 2 +- .../physics/test_isotope_kinetic_fractionation_factors.py | 3 +-- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/PySDM/physics/drop_growth/howell_1949.py b/PySDM/physics/drop_growth/howell_1949.py index 63a29a952d..fb3a1b06a3 100644 --- a/PySDM/physics/drop_growth/howell_1949.py +++ b/PySDM/physics/drop_growth/howell_1949.py @@ -19,7 +19,7 @@ def Fk(const, T, K, lv): Parameters ---------- T - Temperature in Kelvins. + Temperature. K Thermal diffusivity with heat ventilation factor. lv diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index 8b2a9dbc12..ebe731051c 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -1,6 +1,5 @@ """ -kinetic fractionation factor for liquid and ice from -[Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749), +kinetic fractionation factor [Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749), as eq. 3e for n=1 in [Stewart 1975](https://doi.org/10.1029/JC080i009p01133) and eq. 1 in [Bolot 2013](https://doi.org/10.5194/acp-13-7903-2013), where alpha_kinetic is multiplied by alpha equilibrium (eq. 1 defines effective alpha). diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index 73bb810339..7abe0fae9c 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -108,7 +108,7 @@ " return formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_eq[iso](T),\n", " diffusivity_ratio_heavy_to_light=diffusivity_ratio[iso](T),\n", - " saturation_over_ice = ice_saturation_curve_4(const=const, T=T)\n", + " saturation = ice_saturation_curve_4(const=const, T=T)\n", " )" ], "id": "754af83e4ab216bc", diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb index 6b30aeef25..94543cf90c 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb @@ -158,7 +158,7 @@ " alpha_s = formulae.isotope_equilibrium_fractionation_factors.alpha_i_18O(T)\n", " alpha_k = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium=alpha_s,\n", - " saturation_over_ice=Si,\n", + " saturation=Si,\n", " diffusivity_ratio_heavy_to_light=formulae.isotope_diffusivity_ratios.ratio_18O_heavy_to_light(T)\n", " )\n", " alphas_eff[:, i] = alpha_k * alpha_s" diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index f2cb0e4541..8125a4404d 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -5,7 +5,6 @@ import numpy as np import pytest from matplotlib import pyplot -from open_atmos_jupyter_utils import show_plot from PySDM import Formulae from PySDM import physics @@ -192,7 +191,7 @@ def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon( pyplot.grid() if plot: - show_plot() + pyplot.show() else: pyplot.clf() From ec889b8f799a53321d8fb8f08562a3643c4a3b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Fri, 6 Jun 2025 13:09:17 +0200 Subject: [PATCH 07/26] refactor --- .../PySDM_examples/Fisher_1991/fig_2.ipynb | 77 +++++++++++++------ 1 file changed, 53 insertions(+), 24 deletions(-) diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index 7abe0fae9c..070698c227 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -22,8 +22,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:02.863998Z", - "start_time": "2025-05-16T15:57:02.859648Z" + "end_time": "2025-06-06T05:46:08.614401Z", + "start_time": "2025-06-06T05:46:08.610816Z" } }, "cell_type": "code", @@ -43,8 +43,8 @@ "id": "c36c2f5c-17c1-422e-9ab9-f7d612064199", "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:04.803260Z", - "start_time": "2025-05-16T15:57:02.868238Z" + "end_time": "2025-06-06T05:46:10.345865Z", + "start_time": "2025-06-06T05:46:08.619814Z" } }, "source": [ @@ -68,8 +68,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:04.920566Z", - "start_time": "2025-05-16T15:57:04.898066Z" + "end_time": "2025-06-06T05:46:10.431716Z", + "start_time": "2025-06-06T05:46:10.411970Z" } }, "cell_type": "code", @@ -98,17 +98,20 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:04.927752Z", - "start_time": "2025-05-16T15:57:04.925715Z" + "end_time": "2025-06-06T05:46:10.437845Z", + "start_time": "2025-06-06T05:46:10.435829Z" } }, "cell_type": "code", "source": [ "def alpha_kin(iso, T):\n", + " D = const.D0\n", + " Fk = formulae.drop_growth.Fk(T, const.K0, formulae.latent_heat_vapourisation.lv(T))\n", + " transfer_coefficient = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D, Fk)\n", " return formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_eq[iso](T),\n", - " diffusivity_ratio_heavy_to_light=diffusivity_ratio[iso](T),\n", - " saturation = ice_saturation_curve_4(const=const, T=T)\n", + " D_ratio_heavy_to_light=diffusivity_ratio[iso](T),\n", + " saturation = ice_saturation_curve_4(const=const, T=T) #formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient, formulae.saturation_vapour_pressure.pvs_ice(T)) #ice_saturation_curve_4(const=const, T=T)\n", " )" ], "id": "754af83e4ab216bc", @@ -118,8 +121,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:04.937527Z", - "start_time": "2025-05-16T15:57:04.934227Z" + "end_time": "2025-06-06T05:46:10.446894Z", + "start_time": "2025-06-06T05:46:10.444780Z" } }, "cell_type": "code", @@ -147,8 +150,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:04.944946Z", - "start_time": "2025-05-16T15:57:04.942980Z" + "end_time": "2025-06-06T05:46:10.452542Z", + "start_time": "2025-06-06T05:46:10.450693Z" } }, "cell_type": "code", @@ -167,8 +170,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:07.414569Z", - "start_time": "2025-05-16T15:57:04.949635Z" + "end_time": "2025-06-06T05:46:13.268671Z", + "start_time": "2025-06-06T05:46:10.456287Z" } }, "cell_type": "code", @@ -193,8 +196,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:07.885751Z", - "start_time": "2025-05-16T15:57:07.422220Z" + "end_time": "2025-06-06T05:46:13.639419Z", + "start_time": "2025-06-06T05:46:13.274832Z" } }, "cell_type": "code", @@ -232,7 +235,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-05-16T17:57:07.870409\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-06T07:46:13.624051\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -245,7 +248,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "0516fe8df5dd4959ac92021d4321b307" + "model_id": "8cd2abc2ca8742ddba10f0657a5a2f85" } }, "metadata": {}, @@ -257,8 +260,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-16T15:57:08.021924Z", - "start_time": "2025-05-16T15:57:07.893009Z" + "end_time": "2025-06-06T05:46:13.786431Z", + "start_time": "2025-06-06T05:46:13.650119Z" } }, "cell_type": "code", @@ -288,7 +291,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-05-16T17:57:08.006498\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-06T07:46:13.769744\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -301,7 +304,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "49d222ee4a414698aacdd4979e00c4f3" + "model_id": "507e8628a5284dc195fed85eee0b929d" } }, "metadata": {}, @@ -309,6 +312,32 @@ } ], "execution_count": 9 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-06T05:46:13.818266Z", + "start_time": "2025-06-06T05:46:13.798626Z" + } + }, + "cell_type": "code", + "source": "", + "id": "34e05ba4f6fb8e89", + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-06T05:46:13.829695Z", + "start_time": "2025-06-06T05:46:13.827998Z" + } + }, + "cell_type": "code", + "source": "", + "id": "ed8d36417a5336d0", + "outputs": [], + "execution_count": null } ], "metadata": { From 2ec24269ceff775fb1f39eaf2857c6cafcdadb8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 25 Jun 2025 14:42:09 +0200 Subject: [PATCH 08/26] rerun notebook --- .../PySDM_examples/Fisher_1991/fig_2.ipynb | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index 070698c227..be9c6149a8 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -22,8 +22,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:08.614401Z", - "start_time": "2025-06-06T05:46:08.610816Z" + "end_time": "2025-06-25T12:41:17.048483Z", + "start_time": "2025-06-25T12:41:17.041726Z" } }, "cell_type": "code", @@ -43,8 +43,8 @@ "id": "c36c2f5c-17c1-422e-9ab9-f7d612064199", "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:10.345865Z", - "start_time": "2025-06-06T05:46:08.619814Z" + "end_time": "2025-06-25T12:41:21.768860Z", + "start_time": "2025-06-25T12:41:17.056517Z" } }, "source": [ @@ -68,8 +68,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:10.431716Z", - "start_time": "2025-06-06T05:46:10.411970Z" + "end_time": "2025-06-25T12:41:21.875872Z", + "start_time": "2025-06-25T12:41:21.845639Z" } }, "cell_type": "code", @@ -98,8 +98,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:10.437845Z", - "start_time": "2025-06-06T05:46:10.435829Z" + "end_time": "2025-06-25T12:41:21.884154Z", + "start_time": "2025-06-25T12:41:21.881306Z" } }, "cell_type": "code", @@ -121,8 +121,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:10.446894Z", - "start_time": "2025-06-06T05:46:10.444780Z" + "end_time": "2025-06-25T12:41:21.894710Z", + "start_time": "2025-06-25T12:41:21.891746Z" } }, "cell_type": "code", @@ -150,8 +150,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:10.452542Z", - "start_time": "2025-06-06T05:46:10.450693Z" + "end_time": "2025-06-25T12:41:21.901806Z", + "start_time": "2025-06-25T12:41:21.899568Z" } }, "cell_type": "code", @@ -170,8 +170,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:13.268671Z", - "start_time": "2025-06-06T05:46:10.456287Z" + "end_time": "2025-06-25T12:41:25.203838Z", + "start_time": "2025-06-25T12:41:21.907105Z" } }, "cell_type": "code", @@ -196,8 +196,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:13.639419Z", - "start_time": "2025-06-06T05:46:13.274832Z" + "end_time": "2025-06-25T12:41:25.731698Z", + "start_time": "2025-06-25T12:41:25.217926Z" } }, "cell_type": "code", @@ -235,7 +235,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-06T07:46:13.624051\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-25T14:41:25.713352\n image/svg+xml\n \n \n Matplotlib v3.9.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" }, "metadata": {}, "output_type": "display_data" @@ -248,7 +248,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "8cd2abc2ca8742ddba10f0657a5a2f85" + "model_id": "d85508aab73e4fbc91cf47f982b6d8a7" } }, "metadata": {}, @@ -260,8 +260,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:13.786431Z", - "start_time": "2025-06-06T05:46:13.650119Z" + "end_time": "2025-06-25T12:41:25.918505Z", + "start_time": "2025-06-25T12:41:25.743022Z" } }, "cell_type": "code", @@ -291,7 +291,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-06T07:46:13.769744\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-25T14:41:25.899598\n image/svg+xml\n \n \n Matplotlib v3.9.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" }, "metadata": {}, "output_type": "display_data" @@ -304,7 +304,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "507e8628a5284dc195fed85eee0b929d" + "model_id": "dea4782dea4b4c10ac692d809bdbe1c1" } }, "metadata": {}, @@ -316,8 +316,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:13.818266Z", - "start_time": "2025-06-06T05:46:13.798626Z" + "end_time": "2025-06-25T12:41:25.933336Z", + "start_time": "2025-06-25T12:41:25.931149Z" } }, "cell_type": "code", @@ -329,8 +329,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-06T05:46:13.829695Z", - "start_time": "2025-06-06T05:46:13.827998Z" + "end_time": "2025-06-25T12:41:25.943651Z", + "start_time": "2025-06-25T12:41:25.941809Z" } }, "cell_type": "code", From 106f8db855a6cacf806f379a3335f4bcf998c7ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 25 Jun 2025 14:55:15 +0200 Subject: [PATCH 09/26] revert adding effective saturation as not used here --- .../jouzel_and_merlivat_1984.py | 17 ----------------- examples/PySDM_examples/Fisher_1991/fig_2.ipynb | 3 +-- ...est_isotope_kinetic_fractionation_factors.py | 15 --------------- 3 files changed, 1 insertion(+), 34 deletions(-) diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index ebe731051c..5cd2e6ae1f 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -49,20 +49,3 @@ def transfer_coefficient(D, Fk): Thermal transfer coefficient between water vapour and condensate. """ return 1 / (1 + D * Fk) - - @staticmethod - def effective_saturation(transfer_coefficient, RH): - """ - - Parameters - ---------- - transfer_coefficient - Thermal transfer coefficient between water vapour and condensate (liquid water or ice). - RH - Relative humidity. - - Returns - ---------- - Effective vapour saturation over liquid water or ice. - """ - return 1 / (1 - transfer_coefficient * (1 - 1 / RH)) diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index be9c6149a8..ac7206dd82 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -107,11 +107,10 @@ "def alpha_kin(iso, T):\n", " D = const.D0\n", " Fk = formulae.drop_growth.Fk(T, const.K0, formulae.latent_heat_vapourisation.lv(T))\n", - " transfer_coefficient = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D, Fk)\n", " return formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_eq[iso](T),\n", " D_ratio_heavy_to_light=diffusivity_ratio[iso](T),\n", - " saturation = ice_saturation_curve_4(const=const, T=T) #formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient, formulae.saturation_vapour_pressure.pvs_ice(T)) #ice_saturation_curve_4(const=const, T=T)\n", + " saturation = ice_saturation_curve_4(const=const, T=T)\n", " )" ], "id": "754af83e4ab216bc", diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 8125a4404d..0596c876fc 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -47,21 +47,6 @@ def test_units_transfer_coefficient(): # assert assert sut.check("[]") - @staticmethod - def test_units_eff_saturation(): - with DimensionalAnalysis(): - # arrange - transfer_coeff = 1 * physics.si.dimensionless - relative_humidity = 1 * physics.si.dimensionless - - # act - sut = JouzelAndMerlivat1984.effective_saturation( - transfer_coefficient=transfer_coeff, RH=relative_humidity - ) - - # assert - assert sut.check("[]") - @staticmethod def test_fig_9_from_jouzel_and_merlivat_1984(plot=False): """[Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749)""" From b50b61865b783116b27d43d7be1a48bf76633076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 25 Jun 2025 21:36:42 +0200 Subject: [PATCH 10/26] remove unused variables --- examples/PySDM_examples/Fisher_1991/fig_2.ipynb | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index ac7206dd82..6ebee29c8b 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -105,8 +105,6 @@ "cell_type": "code", "source": [ "def alpha_kin(iso, T):\n", - " D = const.D0\n", - " Fk = formulae.drop_growth.Fk(T, const.K0, formulae.latent_heat_vapourisation.lv(T))\n", " return formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_eq[iso](T),\n", " D_ratio_heavy_to_light=diffusivity_ratio[iso](T),\n", From b98187da7f8ce972adc79a1f50ba2910995a26f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 26 Jun 2025 01:26:00 +0200 Subject: [PATCH 11/26] refactor variable name --- .../Jouzel_and_Merlivat_1984/fig_8_9.ipynb | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb index 94543cf90c..7baee37250 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb @@ -22,8 +22,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-15T17:06:23.997785Z", - "start_time": "2025-05-15T17:06:23.992595Z" + "end_time": "2025-06-25T23:25:40.862379Z", + "start_time": "2025-06-25T23:25:40.859115Z" } }, "cell_type": "code", @@ -44,8 +44,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-05-15T17:06:26.070690Z", - "start_time": "2025-05-15T17:06:24.024797Z" + "end_time": "2025-06-25T23:25:42.736860Z", + "start_time": "2025-06-25T23:25:40.951437Z" } }, "source": [ @@ -62,8 +62,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-15T17:06:26.537352Z", - "start_time": "2025-05-15T17:06:26.155905Z" + "end_time": "2025-06-25T23:25:43.030796Z", + "start_time": "2025-06-25T23:25:42.742196Z" } }, "cell_type": "code", @@ -88,8 +88,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-15T17:06:28.504366Z", - "start_time": "2025-05-15T17:06:26.549958Z" + "end_time": "2025-06-25T23:25:44.982409Z", + "start_time": "2025-06-25T23:25:43.041753Z" } }, "cell_type": "code", @@ -120,7 +120,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-05-15T19:06:28.491249\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T01:25:44.970122\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -133,7 +133,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "ba46c750ca244844a1be1b2659613866" + "model_id": "8c15bde98c9c4698979a4cb47ad75d48" } }, "metadata": {}, @@ -145,8 +145,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-15T17:06:29.307012Z", - "start_time": "2025-05-15T17:06:28.519678Z" + "end_time": "2025-06-25T23:25:45.731460Z", + "start_time": "2025-06-25T23:25:44.995396Z" } }, "cell_type": "code", @@ -159,19 +159,19 @@ " alpha_k = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium=alpha_s,\n", " saturation=Si,\n", - " diffusivity_ratio_heavy_to_light=formulae.isotope_diffusivity_ratios.ratio_18O_heavy_to_light(T)\n", + " D_ratio_heavy_to_light=formulae.isotope_diffusivity_ratios.ratio_18O_heavy_to_light(T)\n", " )\n", " alphas_eff[:, i] = alpha_k * alpha_s" ], - "id": "bfc8afbd66b88f32", + "id": "1a7e5ae0c7093428", "outputs": [], "execution_count": 5 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-05-15T17:06:29.540790Z", - "start_time": "2025-05-15T17:06:29.320601Z" + "end_time": "2025-06-25T23:25:45.959914Z", + "start_time": "2025-06-25T23:25:45.739364Z" } }, "cell_type": "code", @@ -193,14 +193,14 @@ "pyplot.legend()\n", "show_plot('fig_9')" ], - "id": "c13c409d4d6f6360", + "id": "8b1287b4696c7dda", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-05-15T19:06:29.521944\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T01:25:45.940460\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -213,7 +213,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "b58a64bd5bb740b8a1a80b60dc0f27a0" + "model_id": "a478d96b93d34ed2936063de54732783" } }, "metadata": {}, @@ -225,8 +225,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-05-15T17:06:29.554379Z", - "start_time": "2025-05-15T17:06:29.551542Z" + "end_time": "2025-06-25T23:25:45.972541Z", + "start_time": "2025-06-25T23:25:45.970842Z" } }, "cell_type": "code", From 40267200320e752f20246a03102fd0c5eb3be4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 26 Jun 2025 01:28:26 +0200 Subject: [PATCH 12/26] remove unused function as will be addressed in new PR --- .../jouzel_and_merlivat_1984.py | 19 ------------------- ...t_isotope_kinetic_fractionation_factors.py | 13 ------------- 2 files changed, 32 deletions(-) diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index 5cd2e6ae1f..f17186751d 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -30,22 +30,3 @@ def alpha_kinetic(alpha_equilibrium, saturation, D_ratio_heavy_to_light): return saturation / ( alpha_equilibrium / D_ratio_heavy_to_light * (saturation - 1) + 1 ) - - @staticmethod - def transfer_coefficient(D, Fk): - """ - eq. (A4) in Jouzel & Merlivat 1984, - eq. (A6) in Bolot 2013. - - Parameters - ---------- - D - Diffusion coefficient for light isotope. - Fk - Term associated with heat transfer. - - Returns - ---------- - Thermal transfer coefficient between water vapour and condensate. - """ - return 1 / (1 + D * Fk) diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 0596c876fc..84feeb7ed4 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -34,19 +34,6 @@ def test_units_alpha_kinetic(): # assert assert sut.check("[]") - @staticmethod - def test_units_transfer_coefficient(): - with DimensionalAnalysis(): - # arrange - D = 1 * physics.si.m**2 / physics.si.s - Fk = 1 * physics.si.s / physics.si.m**2 - - # act - sut = JouzelAndMerlivat1984.transfer_coefficient(D=D, Fk=Fk) - - # assert - assert sut.check("[]") - @staticmethod def test_fig_9_from_jouzel_and_merlivat_1984(plot=False): """[Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749)""" From b443915482bc42f1f150e8b998877e054ca42ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 26 Jun 2025 09:21:19 +0200 Subject: [PATCH 13/26] add effective saturation --- .../jouzel_and_merlivat_1984.py | 36 +++++ .../PySDM_examples/Fisher_1991/fig_2.ipynb | 125 +++++++++--------- ...t_isotope_kinetic_fractionation_factors.py | 13 ++ 3 files changed, 112 insertions(+), 62 deletions(-) diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index f17186751d..ebe731051c 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -30,3 +30,39 @@ def alpha_kinetic(alpha_equilibrium, saturation, D_ratio_heavy_to_light): return saturation / ( alpha_equilibrium / D_ratio_heavy_to_light * (saturation - 1) + 1 ) + + @staticmethod + def transfer_coefficient(D, Fk): + """ + eq. (A4) in Jouzel & Merlivat 1984, + eq. (A6) in Bolot 2013. + + Parameters + ---------- + D + Diffusion coefficient for light isotope. + Fk + Term associated with heat transfer. + + Returns + ---------- + Thermal transfer coefficient between water vapour and condensate. + """ + return 1 / (1 + D * Fk) + + @staticmethod + def effective_saturation(transfer_coefficient, RH): + """ + + Parameters + ---------- + transfer_coefficient + Thermal transfer coefficient between water vapour and condensate (liquid water or ice). + RH + Relative humidity. + + Returns + ---------- + Effective vapour saturation over liquid water or ice. + """ + return 1 / (1 - transfer_coefficient * (1 - 1 / RH)) diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index 6ebee29c8b..6327574c20 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -22,8 +22,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:17.048483Z", - "start_time": "2025-06-25T12:41:17.041726Z" + "end_time": "2025-06-26T00:01:47.406303Z", + "start_time": "2025-06-26T00:01:47.403017Z" } }, "cell_type": "code", @@ -36,15 +36,15 @@ ], "id": "31481014375c7d36", "outputs": [], - "execution_count": 1 + "execution_count": 21 }, { "cell_type": "code", "id": "c36c2f5c-17c1-422e-9ab9-f7d612064199", "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:21.768860Z", - "start_time": "2025-06-25T12:41:17.056517Z" + "end_time": "2025-06-26T00:01:47.416649Z", + "start_time": "2025-06-26T00:01:47.414494Z" } }, "source": [ @@ -63,13 +63,13 @@ ")" ], "outputs": [], - "execution_count": 2 + "execution_count": 22 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:21.875872Z", - "start_time": "2025-06-25T12:41:21.845639Z" + "end_time": "2025-06-26T00:07:51.434963Z", + "start_time": "2025-06-26T00:07:51.358744Z" } }, "cell_type": "code", @@ -91,18 +91,27 @@ " alpha_eq[isotope] = getattr(formulae.isotope_equilibrium_fractionation_factors, f'alpha_i_{isotope}')\n", " diffusivity_ratio[isotope] = getattr(formulae.isotope_diffusivity_ratios, f'ratio_{isotope}_heavy_to_light')" ], - "id": "91bb290498429f53", - "outputs": [], - "execution_count": 3 + "id": "92e11666a7b83d4d", + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'Formulae' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[1], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m formulae\u001B[38;5;241m=\u001B[39m \u001B[43mFormulae\u001B[49m(\n\u001B[1;32m 2\u001B[0m isotope_meteoric_water_line\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mDansgaard1964\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 3\u001B[0m isotope_diffusivity_ratios\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mStewart1975\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 4\u001B[0m isotope_kinetic_fractionation_factors\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mJouzelAndMerlivat1984\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 5\u001B[0m isotope_equilibrium_fractionation_factors\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mMerlivatAndNief1967+Majoube1970\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 6\u001B[0m )\n\u001B[1;32m 7\u001B[0m const \u001B[38;5;241m=\u001B[39m formulae\u001B[38;5;241m.\u001B[39mconstants\n\u001B[1;32m 8\u001B[0m K2C \u001B[38;5;241m=\u001B[39m formulae\u001B[38;5;241m.\u001B[39mtrivia\u001B[38;5;241m.\u001B[39mK2C\n", + "\u001B[0;31mNameError\u001B[0m: name 'Formulae' is not defined" + ] + } + ], + "execution_count": 1 }, { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-25T12:41:21.884154Z", - "start_time": "2025-06-25T12:41:21.881306Z" - } - }, + "metadata": {}, "cell_type": "code", + "outputs": [], + "execution_count": null, "source": [ "def alpha_kin(iso, T):\n", " return formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", @@ -111,15 +120,13 @@ " saturation = ice_saturation_curve_4(const=const, T=T)\n", " )" ], - "id": "754af83e4ab216bc", - "outputs": [], - "execution_count": 4 + "id": "cd4693f604f74961" }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:21.894710Z", - "start_time": "2025-06-25T12:41:21.891746Z" + "end_time": "2025-06-26T00:06:26.448958Z", + "start_time": "2025-06-26T00:06:26.443863Z" } }, "cell_type": "code", @@ -142,13 +149,13 @@ ], "id": "9ca4e3256065274b", "outputs": [], - "execution_count": 5 + "execution_count": 37 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:21.901806Z", - "start_time": "2025-06-25T12:41:21.899568Z" + "end_time": "2025-06-26T00:06:26.830205Z", + "start_time": "2025-06-26T00:06:26.825441Z" } }, "cell_type": "code", @@ -160,15 +167,15 @@ "y_e = 0\n", "yf = partial(vapour_mixing_ratio, formulae)\n" ], - "id": "71979cfe7348344d", + "id": "7bce3bc5674ae8cb", "outputs": [], - "execution_count": 6 + "execution_count": 38 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:25.203838Z", - "start_time": "2025-06-25T12:41:21.907105Z" + "end_time": "2025-06-26T00:06:27.188718Z", + "start_time": "2025-06-26T00:06:27.181208Z" } }, "cell_type": "code", @@ -180,21 +187,17 @@ " t_eval=temperature\n", ")\n", "assert result.success, result.message\n", - "delta_2H, delta_18O = result.y\n", - "d_excess = formulae.isotope_meteoric_water_line.excess_d(\n", - " delta_2H=delta_2H,\n", - " delta_18O=delta_18O\n", - ")" + "delta_2H, delta_18O = result.y\n" ], - "id": "4e112378083e50f5", + "id": "200252902b10ccb6", "outputs": [], - "execution_count": 7 + "execution_count": 39 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:25.731698Z", - "start_time": "2025-06-25T12:41:25.217926Z" + "end_time": "2025-06-26T00:06:27.846799Z", + "start_time": "2025-06-26T00:06:27.548756Z" } }, "cell_type": "code", @@ -225,14 +228,14 @@ "pyplot.legend()\n", "show_plot(\"fig_1\")" ], - "id": "153a6e26bc2be38a", + "id": "262ff6a72a6d27ec", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-25T14:41:25.713352\n image/svg+xml\n \n \n Matplotlib v3.9.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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T02:06:27.829577\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -245,27 +248,30 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "d85508aab73e4fbc91cf47f982b6d8a7" + "model_id": "c198c7cc9c674242806e574bcdb7f519" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 8 + "execution_count": 40 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:25.918505Z", - "start_time": "2025-06-25T12:41:25.743022Z" + "end_time": "2025-06-26T00:06:28.750924Z", + "start_time": "2025-06-26T00:06:28.600727Z" } }, "cell_type": "code", "source": [ "d_excess_from_fig2 = np.array((10, 8, 7, 6.8, 6, 5.3, 4, 2.5, 0)) * PER_MILLE\n", "T_from_fig2 = np.linspace(-50, -10, n_points)\n", - "\n", + "d_excess = formulae.isotope_meteoric_water_line.excess_d(\n", + " delta_2H=delta_2H,\n", + " delta_18O=delta_18O\n", + ")\n", "\n", "pyplot.plot(\n", " K2C(temperature[::-1]),\n", @@ -281,14 +287,14 @@ "pyplot.legend()\n", "show_plot(\"fig_2\")" ], - "id": "571d258dc7dea96f", + "id": "2cf7385894279338", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-25T14:41:25.899598\n image/svg+xml\n \n \n Matplotlib v3.9.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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T02:06:28.732994\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -301,40 +307,35 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "dea4782dea4b4c10ac692d809bdbe1c1" + "model_id": "e15f8309dda943039c51bdf321ca7e1d" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 9 + "execution_count": 41 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T12:41:25.933336Z", - "start_time": "2025-06-25T12:41:25.931149Z" + "end_time": "2025-06-26T00:01:47.815828Z", + "start_time": "2025-06-26T00:01:47.813196Z" } }, "cell_type": "code", - "source": "", - "id": "34e05ba4f6fb8e89", "outputs": [], + "source": "", + "id": "56c93f096262f1bd", "execution_count": null }, { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-25T12:41:25.943651Z", - "start_time": "2025-06-25T12:41:25.941809Z" - } - }, + "metadata": {}, "cell_type": "code", - "source": "", - "id": "ed8d36417a5336d0", "outputs": [], - "execution_count": null + "execution_count": null, + "source": "", + "id": "e77f759f327ff7ac" } ], "metadata": { diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 84feeb7ed4..0596c876fc 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -34,6 +34,19 @@ def test_units_alpha_kinetic(): # assert assert sut.check("[]") + @staticmethod + def test_units_transfer_coefficient(): + with DimensionalAnalysis(): + # arrange + D = 1 * physics.si.m**2 / physics.si.s + Fk = 1 * physics.si.s / physics.si.m**2 + + # act + sut = JouzelAndMerlivat1984.transfer_coefficient(D=D, Fk=Fk) + + # assert + assert sut.check("[]") + @staticmethod def test_fig_9_from_jouzel_and_merlivat_1984(plot=False): """[Jouzel & Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749)""" From 0620222f6fbd1eea5b7d8f22e99dbfc64b2141f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 26 Jun 2025 16:25:44 +0200 Subject: [PATCH 14/26] create alphas comparison and temperatures --- .../jouzel_and_merlivat_1984.py | 2 +- .../PySDM_examples/Fisher_1991/fig_2.ipynb | 104 ++++--- .../alpha_kin_comparison.ipynb | 270 ++++++++++++++++++ 3 files changed, 322 insertions(+), 54 deletions(-) create mode 100644 examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index ebe731051c..0e4ae30502 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -34,7 +34,7 @@ def alpha_kinetic(alpha_equilibrium, saturation, D_ratio_heavy_to_light): @staticmethod def transfer_coefficient(D, Fk): """ - eq. (A4) in Jouzel & Merlivat 1984, + eq. (A4) in Jouzel & Merlivat 1975, eq. (A6) in Bolot 2013. Parameters diff --git a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb index 6327574c20..b822819267 100644 --- a/examples/PySDM_examples/Fisher_1991/fig_2.ipynb +++ b/examples/PySDM_examples/Fisher_1991/fig_2.ipynb @@ -22,8 +22,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:01:47.406303Z", - "start_time": "2025-06-26T00:01:47.403017Z" + "end_time": "2025-06-26T12:52:06.895292Z", + "start_time": "2025-06-26T12:52:06.870075Z" } }, "cell_type": "code", @@ -36,15 +36,15 @@ ], "id": "31481014375c7d36", "outputs": [], - "execution_count": 21 + "execution_count": 75 }, { "cell_type": "code", "id": "c36c2f5c-17c1-422e-9ab9-f7d612064199", "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:01:47.416649Z", - "start_time": "2025-06-26T00:01:47.414494Z" + "end_time": "2025-06-26T12:52:06.933264Z", + "start_time": "2025-06-26T12:52:06.920052Z" } }, "source": [ @@ -63,13 +63,13 @@ ")" ], "outputs": [], - "execution_count": 22 + "execution_count": 76 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:07:51.434963Z", - "start_time": "2025-06-26T00:07:51.358744Z" + "end_time": "2025-06-26T12:52:06.969470Z", + "start_time": "2025-06-26T12:52:06.943624Z" } }, "cell_type": "code", @@ -92,26 +92,17 @@ " diffusivity_ratio[isotope] = getattr(formulae.isotope_diffusivity_ratios, f'ratio_{isotope}_heavy_to_light')" ], "id": "92e11666a7b83d4d", - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'Formulae' is not defined", - "output_type": "error", - "traceback": [ - "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[0;31mNameError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[0;32mIn[1], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m formulae\u001B[38;5;241m=\u001B[39m \u001B[43mFormulae\u001B[49m(\n\u001B[1;32m 2\u001B[0m isotope_meteoric_water_line\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mDansgaard1964\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 3\u001B[0m isotope_diffusivity_ratios\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mStewart1975\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 4\u001B[0m isotope_kinetic_fractionation_factors\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mJouzelAndMerlivat1984\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 5\u001B[0m isotope_equilibrium_fractionation_factors\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mMerlivatAndNief1967+Majoube1970\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[1;32m 6\u001B[0m )\n\u001B[1;32m 7\u001B[0m const \u001B[38;5;241m=\u001B[39m formulae\u001B[38;5;241m.\u001B[39mconstants\n\u001B[1;32m 8\u001B[0m K2C \u001B[38;5;241m=\u001B[39m formulae\u001B[38;5;241m.\u001B[39mtrivia\u001B[38;5;241m.\u001B[39mK2C\n", - "\u001B[0;31mNameError\u001B[0m: name 'Formulae' is not defined" - ] - } - ], - "execution_count": 1 + "outputs": [], + "execution_count": 77 }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T12:52:06.995059Z", + "start_time": "2025-06-26T12:52:06.991365Z" + } + }, "cell_type": "code", - "outputs": [], - "execution_count": null, "source": [ "def alpha_kin(iso, T):\n", " return formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", @@ -120,13 +111,15 @@ " saturation = ice_saturation_curve_4(const=const, T=T)\n", " )" ], - "id": "cd4693f604f74961" + "id": "cd4693f604f74961", + "outputs": [], + "execution_count": 78 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:06:26.448958Z", - "start_time": "2025-06-26T00:06:26.443863Z" + "end_time": "2025-06-26T12:52:07.012903Z", + "start_time": "2025-06-26T12:52:07.009364Z" } }, "cell_type": "code", @@ -149,13 +142,13 @@ ], "id": "9ca4e3256065274b", "outputs": [], - "execution_count": 37 + "execution_count": 79 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:06:26.830205Z", - "start_time": "2025-06-26T00:06:26.825441Z" + "end_time": "2025-06-26T12:52:07.035034Z", + "start_time": "2025-06-26T12:52:07.029001Z" } }, "cell_type": "code", @@ -169,13 +162,13 @@ ], "id": "7bce3bc5674ae8cb", "outputs": [], - "execution_count": 38 + "execution_count": 80 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:06:27.188718Z", - "start_time": "2025-06-26T00:06:27.181208Z" + "end_time": "2025-06-26T12:52:07.060065Z", + "start_time": "2025-06-26T12:52:07.051207Z" } }, "cell_type": "code", @@ -191,13 +184,13 @@ ], "id": "200252902b10ccb6", "outputs": [], - "execution_count": 39 + "execution_count": 81 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:06:27.846799Z", - "start_time": "2025-06-26T00:06:27.548756Z" + "end_time": "2025-06-26T12:52:07.270301Z", + "start_time": "2025-06-26T12:52:07.071166Z" } }, "cell_type": "code", @@ -235,7 +228,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T02:06:27.829577\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T14:52:07.252850\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -248,20 +241,20 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "c198c7cc9c674242806e574bcdb7f519" + "model_id": "30c9f38a49434a6c8ee0dc089a86776f" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 40 + "execution_count": 82 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:06:28.750924Z", - "start_time": "2025-06-26T00:06:28.600727Z" + "end_time": "2025-06-26T12:53:44.714805Z", + "start_time": "2025-06-26T12:53:44.491727Z" } }, "cell_type": "code", @@ -274,7 +267,7 @@ ")\n", "\n", "pyplot.plot(\n", - " K2C(temperature[::-1]),\n", + " K2C(temperature)[::-1],\n", " in_unit(d_excess, PER_MILLE)[::-1],\n", " label=\"d-excess, TODO #1601 (WORK IN PROGRESS - NO MATCH WITH THE PAPER YET)\",\n", ")\n", @@ -294,7 +287,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T02:06:28.732994\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T14:53:44.696623\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -307,35 +300,40 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "e15f8309dda943039c51bdf321ca7e1d" + "model_id": "e95ce4041723468da4df38c159c1f428" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 41 + "execution_count": 87 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T00:01:47.815828Z", - "start_time": "2025-06-26T00:01:47.813196Z" + "end_time": "2025-06-26T12:52:07.529493Z", + "start_time": "2025-06-26T12:52:07.524611Z" } }, "cell_type": "code", - "outputs": [], "source": "", "id": "56c93f096262f1bd", + "outputs": [], "execution_count": null }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T12:52:07.559623Z", + "start_time": "2025-06-26T12:52:07.556789Z" + } + }, "cell_type": "code", - "outputs": [], - "execution_count": null, "source": "", - "id": "e77f759f327ff7ac" + "id": "e77f759f327ff7ac", + "outputs": [], + "execution_count": null } ], "metadata": { diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb new file mode 100644 index 0000000000..fafc9eba8d --- /dev/null +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb @@ -0,0 +1,270 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-06-26T13:21:35.322671Z", + "start_time": "2025-06-26T13:21:33.674043Z" + } + }, + "source": [ + "from matplotlib import pyplot\n", + "import numpy as np\n", + "from open_atmos_jupyter_utils import show_plot\n", + "\n", + "from PySDM import Formulae\n", + "from PySDM.physics import si\n", + "from PySDM.physics.constants import PER_MILLE, in_unit\n", + "from PySDM_examples.Jouzel_and_Merlivat_1984.thermodynamic_profiles import (\n", + " vapour_mixing_ratio,\n", + " ice_saturation_curve_4\n", + ")" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:09:26.955516Z", + "start_time": "2025-06-26T14:09:26.872107Z" + } + }, + "cell_type": "code", + "source": [ + "formulae= Formulae(\n", + " latent_heat_vapourisation=\"Lowe2019\",\n", + " latent_heat_sublimation=\"MurphyKoop2005\",\n", + " saturation_vapour_pressure=\"Lowe1977\",\n", + " isotope_meteoric_water_line=\"Dansgaard1964\",\n", + " isotope_diffusivity_ratios=\"Stewart1975\",\n", + " isotope_kinetic_fractionation_factors=\"JouzelAndMerlivat1984\",\n", + " isotope_equilibrium_fractionation_factors=\"MerlivatAndNief1967+Majoube1970\",\n", + ")\n", + "const = formulae.constants\n", + "K2C = formulae.trivia.K2C\n", + "\n", + "diffusivity_ratio = {}\n", + "alpha_eq = {}\n", + "alpha_kinetic = {}\n", + "isotopes = (\"2H\", \"18O\")\n", + "for isotope in isotopes:\n", + " alpha_eq[isotope] = getattr(formulae.isotope_equilibrium_fractionation_factors, f'alpha_i_{isotope}')\n", + " diffusivity_ratio[isotope] = getattr(formulae.isotope_diffusivity_ratios, f'ratio_{isotope}_heavy_to_light')" + ], + "id": "bcad8d46c3f5e984", + "outputs": [], + "execution_count": 47 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:09:51.737325Z", + "start_time": "2025-06-26T14:09:51.034917Z" + } + }, + "cell_type": "code", + "source": [ + "iso = '2H'\n", + "temperature = np.linspace(260, 225, 10) * si.K\n", + "saturation = ice_saturation_curve_4(const=const, T=temperature)\n", + "D_ratio = diffusivity_ratio[iso](temperature)\n", + "alpha_equilibrium = alpha_eq[iso](temperature)\n", + "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = saturation\n", + " )\n", + "K = const.K0\n", + "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", + "ls = formulae.latent_heat_sublimation.ls(temperature)\n", + "Fk = formulae.drop_growth.Fk(T=temperature, K=K, lv=ls)\n", + "D_light = const.D0\n", + "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", + "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D=D_light, Fk=Fk/const.rho_w * rho_s)\n", + "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient=A, RH=saturation)\n", + "alpha_kinetic_eff = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = eff_saturation\n", + " )" + ], + "id": "e1141ca04de296b9", + "outputs": [], + "execution_count": 48 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:09:51.932853Z", + "start_time": "2025-06-26T14:09:51.930293Z" + } + }, + "cell_type": "code", + "source": "print(A)", + "id": "5bb968b5fb3bcadf", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.72500524 0.78282009 0.8327799 0.87434292 0.90772033 0.93366521\n", + " 0.95324779 0.9676606 0.97805234 0.9853561 ]\n" + ] + } + ], + "execution_count": 49 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:09:53.219247Z", + "start_time": "2025-06-26T14:09:53.062662Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(saturation, alpha_kinetic, label=\"with Si\")\n", + "pyplot.plot(saturation, alpha_kinetic_eff, label=\"with S_eff\")\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " xlabel=\"S\",\n", + " ylabel=\"$\\\\alpha$\",\n", + ")\n", + "show_plot('alpha_kinetic')" + ], + "id": "ce09807c50d4242d", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T16:09:53.208835\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "9f1585c97ed24293a55d3218540f4510" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 50 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:18:49.634381Z", + "start_time": "2025-06-26T14:18:49.627140Z" + } + }, + "cell_type": "code", + "source": [ + "cp = 1885 * si.joule / si.kilogram / si.K\n", + "q_s = 1\n", + "drop_temperature = temperature - ls / cp * (1 - saturation) * D_light / K * q_s / A" + ], + "id": "d2b5ece731ef507d", + "outputs": [], + "execution_count": 55 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:20:06.536451Z", + "start_time": "2025-06-26T14:20:06.478027Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(temperature, drop_temperature)\n", + "pyplot.plot(temperature, temperature, '--')\n", + "pyplot.grid()" + ], + "id": "6bc3f1e45bcc2cfc", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T16:20:06.524615\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 61 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T14:20:51.127353Z", + "start_time": "2025-06-26T14:20:51.049864Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(temperature, drop_temperature-temperature)\n", + "pyplot.grid()" + ], + "id": "7663dc1bca8593d", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T16:20:51.117577\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 63 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "de3209afcdf0f90c" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c4ea180db33a5af3627ad71202b9700dfc9b26cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Fri, 27 Jun 2025 10:56:32 +0200 Subject: [PATCH 15/26] work with Elise --- .../alpha_kin_comparison.ipynb | 476 ++++++++++++++++-- 1 file changed, 434 insertions(+), 42 deletions(-) diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb index fafc9eba8d..ce8183174c 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb @@ -6,8 +6,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-06-26T13:21:35.322671Z", - "start_time": "2025-06-26T13:21:33.674043Z" + "end_time": "2025-06-26T18:19:05.478936Z", + "start_time": "2025-06-26T18:19:05.420687Z" } }, "source": [ @@ -24,13 +24,13 @@ ")" ], "outputs": [], - "execution_count": 1 + "execution_count": 121 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:09:26.955516Z", - "start_time": "2025-06-26T14:09:26.872107Z" + "end_time": "2025-06-26T18:19:05.600952Z", + "start_time": "2025-06-26T18:19:05.527167Z" } }, "cell_type": "code", @@ -38,7 +38,7 @@ "formulae= Formulae(\n", " latent_heat_vapourisation=\"Lowe2019\",\n", " latent_heat_sublimation=\"MurphyKoop2005\",\n", - " saturation_vapour_pressure=\"Lowe1977\",\n", + " saturation_vapour_pressure=\"MurphyKoop2005\",\n", " isotope_meteoric_water_line=\"Dansgaard1964\",\n", " isotope_diffusivity_ratios=\"Stewart1975\",\n", " isotope_kinetic_fractionation_factors=\"JouzelAndMerlivat1984\",\n", @@ -57,20 +57,161 @@ ], "id": "bcad8d46c3f5e984", "outputs": [], - "execution_count": 47 + "execution_count": 122 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:09:51.737325Z", - "start_time": "2025-06-26T14:09:51.034917Z" + "end_time": "2025-06-26T18:19:05.612304Z", + "start_time": "2025-06-26T18:19:05.609170Z" + } + }, + "cell_type": "code", + "source": [ + "def curve_6(temperature):\n", + " return 0.05 + 0.906 * np.exp(-0.008 * (temperature - 273.15))" + ], + "id": "47d40031c9347bb1", + "outputs": [], + "execution_count": 123 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:19:05.630204Z", + "start_time": "2025-06-26T18:19:05.618929Z" + } + }, + "cell_type": "code", + "source": [ + "iso = '2H'\n", + "temperature = np.linspace(300, 225, 10) * si.K\n", + "saturation_4 = ice_saturation_curve_4(const=const, T=temperature)\n", + "D_ratio = diffusivity_ratio[iso](temperature)\n", + "alpha_equilibrium = alpha_eq[iso](temperature)\n", + "alpha_kinetic_4 = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = saturation_4\n", + " )\n", + "K = const.K0\n", + "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", + "ls = formulae.latent_heat_sublimation.ls(temperature)\n", + "Fk = formulae.drop_growth.Fk(T=temperature, K=K, lv=ls)\n", + "D_light = const.D0\n", + "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", + "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D=D_light, Fk=Fk/const.rho_w * rho_s)\n", + "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient=A, RH=saturation_4)\n", + "alpha_kinetic_eff_4 = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = eff_saturation\n", + " )" + ], + "id": "e1141ca04de296b9", + "outputs": [], + "execution_count": 124 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:19:05.640846Z", + "start_time": "2025-06-26T18:19:05.637112Z" + } + }, + "cell_type": "code", + "source": [ + "iso = '2H'\n", + "temperature = np.linspace(300, 225, 10) * si.K\n", + "saturation_6 = curve_6(temperature)\n", + "D_ratio = diffusivity_ratio[iso](temperature)\n", + "alpha_equilibrium = alpha_eq[iso](temperature)\n", + "alpha_kinetic_6 = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = saturation_6\n", + " )\n", + "K = const.K0\n", + "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", + "ls = formulae.latent_heat_sublimation.ls(temperature)\n", + "Fk = formulae.drop_growth.Fk(T=temperature, K=K, lv=ls)\n", + "D_light = const.D0\n", + "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", + "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D=D_light, Fk=Fk/const.rho_w * rho_s)\n", + "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient=A, RH=saturation_6)\n", + "alpha_kinetic_eff_6 = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = eff_saturation\n", + " )" + ], + "id": "5bb968b5fb3bcadf", + "outputs": [], + "execution_count": 125 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:26:31.720957Z", + "start_time": "2025-06-26T18:26:31.535609Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(temperature, alpha_kinetic_6, 'k', label=\"with Si (6)\")\n", + "pyplot.plot(temperature, alpha_kinetic_eff_6, '--k', label=\"with S_eff (6)\")\n", + "pyplot.plot(temperature, alpha_kinetic_4, 'r', label=\"with Si (4)\")\n", + "pyplot.plot(temperature, alpha_kinetic_eff_4, '--r', label=\"with S_eff (4)\")\n", + "\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " xlabel=\"temperature\",\n", + " ylabel=\"$\\\\alpha$\",\n", + ")\n", + "pyplot.grid()\n", + "show_plot('alpha_kinetic')" + ], + "id": "48a9b80209b0890", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:26:31.705370\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "e6b2b91e3fca40a78e12f9279e44dcec" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 140 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:21:42.885690Z", + "start_time": "2025-06-26T18:21:42.873547Z" } }, "cell_type": "code", "source": [ "iso = '2H'\n", - "temperature = np.linspace(260, 225, 10) * si.K\n", - "saturation = ice_saturation_curve_4(const=const, T=temperature)\n", + "temperature = np.linspace(300, 225, 10) * si.K\n", + "saturation= ice_saturation_curve_4(const=const, T=temperature)\n", "D_ratio = diffusivity_ratio[iso](temperature)\n", "alpha_equilibrium = alpha_eq[iso](temperature)\n", "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", @@ -92,37 +233,63 @@ " saturation = eff_saturation\n", " )" ], - "id": "e1141ca04de296b9", + "id": "89c8cff2d2b25160", "outputs": [], - "execution_count": 48 + "execution_count": 131 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:09:51.932853Z", - "start_time": "2025-06-26T14:09:51.930293Z" + "end_time": "2025-06-26T18:21:43.635172Z", + "start_time": "2025-06-26T18:21:43.460528Z" } }, "cell_type": "code", - "source": "print(A)", - "id": "5bb968b5fb3bcadf", + "source": [ + "pyplot.plot(temperature, alpha_kinetic, label=\"with Si\")\n", + "pyplot.plot(temperature, alpha_kinetic_eff, label=\"with S_eff\")\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " xlabel=\"temperature\",\n", + " ylabel=\"$\\\\alpha$\",\n", + ")\n", + "pyplot.grid()\n", + "show_plot('alpha_kinetic')" + ], + "id": "ce09807c50d4242d", "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.72500524 0.78282009 0.8327799 0.87434292 0.90772033 0.93366521\n", - " 0.95324779 0.9676606 0.97805234 0.9853561 ]\n" - ] + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:21:43.621157\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "8b5754396baa488483374e0487e16fc2" + } + }, + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 49 + "execution_count": 132 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:09:53.219247Z", - "start_time": "2025-06-26T14:09:53.062662Z" + "end_time": "2025-06-26T18:21:52.036310Z", + "start_time": "2025-06-26T18:21:51.884225Z" } }, "cell_type": "code", @@ -134,16 +301,17 @@ " xlabel=\"S\",\n", " ylabel=\"$\\\\alpha$\",\n", ")\n", + "pyplot.grid()\n", "show_plot('alpha_kinetic')" ], - "id": "ce09807c50d4242d", + "id": "7e55c2745ba63c49", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T16:09:53.208835\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:21:52.023179\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -156,20 +324,20 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "9f1585c97ed24293a55d3218540f4510" + "model_id": "c2e3e406b07244aeb9048b72127454ec" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 50 + "execution_count": 133 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:18:49.634381Z", - "start_time": "2025-06-26T14:18:49.627140Z" + "end_time": "2025-06-26T18:21:59.437794Z", + "start_time": "2025-06-26T18:21:59.432790Z" } }, "cell_type": "code", @@ -180,13 +348,13 @@ ], "id": "d2b5ece731ef507d", "outputs": [], - "execution_count": 55 + "execution_count": 134 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:20:06.536451Z", - "start_time": "2025-06-26T14:20:06.478027Z" + "end_time": "2025-06-26T18:22:00.130776Z", + "start_time": "2025-06-26T18:22:00.063740Z" } }, "cell_type": "code", @@ -202,19 +370,19 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T16:20:06.524615\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:00.119907\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 61 + "execution_count": 135 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-26T14:20:51.127353Z", - "start_time": "2025-06-26T14:20:51.049864Z" + "end_time": "2025-06-26T18:22:01.637627Z", + "start_time": "2025-06-26T18:22:01.574159Z" } }, "cell_type": "code", @@ -229,13 +397,237 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T16:20:51.117577\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:01.625395\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 136 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:22:02.464586Z", + "start_time": "2025-06-26T18:22:02.459734Z" + } + }, + "cell_type": "code", + "source": "", + "id": "de3209afcdf0f90c", + "outputs": [], + "execution_count": null + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:22:03.069180Z", + "start_time": "2025-06-26T18:22:03.057634Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "temperature = np.linspace(300, 225, 10) * si.K\n", + "saturation_wrt_ice = formulae.saturation_vapour_pressure.pvs_water(temperature)/formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", + "print(formulae.saturation_vapour_pressure.pvs_water(temperature))\n", + "D_ratio = diffusivity_ratio[iso](temperature)\n", + "alpha_equilibrium = alpha_eq[iso](temperature)\n", + "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = saturation_wrt_ice\n", + " )\n", + "K = const.K0\n", + "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", + "ls = formulae.latent_heat_sublimation.ls(temperature)\n", + "Fk = formulae.drop_growth.Fk(T=temperature, K=K, lv=ls)\n", + "D_light = const.D0\n", + "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", + "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D=D_light, Fk=Fk/const.rho_w * rho_s)\n", + "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient=A, RH=saturation_wrt_ice)\n", + "alpha_kinetic_eff = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = eff_saturation\n", + " )" + ], + "id": "ae040f63f5118298", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3536.76441305 2132.90307391 1243.42896172 698.45958047 376.66801387\n", + " 194.22282511 95.30126979 44.23776275 19.27605025 7.80625087]\n" + ] + } + ], + "execution_count": 137 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:22:04.499054Z", + "start_time": "2025-06-26T18:22:04.345541Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(temperature, alpha_kinetic, label=\"with Si\")\n", + "pyplot.plot(temperature, alpha_kinetic_eff, label=\"with S_eff\")\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " xlabel=\"temperature\",\n", + " ylabel=\"$\\\\alpha$\",\n", + ")\n", + "pyplot.grid()\n", + "show_plot('alpha_kinetic')" + ], + "id": "49fc37c3975214ab", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:04.485868\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "590c2dfb2a634b8b9d105332bc1321de" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 138 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:22:07.452200Z", + "start_time": "2025-06-26T18:22:07.319946Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(temperature, saturation_wrt_ice, label=\"Si\")\n", + "pyplot.plot(temperature, eff_saturation, label=\"S_eff\")\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " xlabel=\"temperature\",\n", + " ylabel=\"S\",\n", + ")\n", + "pyplot.grid()\n", + "show_plot('alpha_kinetic')" + ], + "id": "aed6a85080b0c92c", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:07.437913\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "df7f830b7f2c479695ca1d5e214565b0" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 139 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:19:06.207227Z", + "start_time": "2025-06-26T15:31:12.603552Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(K2C(temperature), saturation_wrt_ice - eff_saturation)\n", + "pyplot.grid()" + ], + "id": "50713009314f8a4d", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T17:31:13.035337\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 116 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-06-26T18:19:06.207444Z", + "start_time": "2025-06-26T15:43:29.545239Z" + } + }, + "cell_type": "code", + "source": [ + "pvs_water = formulae.saturation_vapour_pressure.pvs_water(temperature)\n", + "pvs_ice = formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", + "pyplot.plot(temperature,pvs_water)\n", + "pyplot.plot(temperature, pvs_ice)\n", + "pyplot.plot(temperature, pvs_water-pvs_ice)\n", + "py" + ], + "id": "cab9b5d3df23f632", + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T17:43:29.650667\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 63 + "execution_count": 120 }, { "metadata": {}, @@ -243,7 +635,7 @@ "outputs": [], "execution_count": null, "source": "", - "id": "de3209afcdf0f90c" + "id": "eb3f1afea4b80f7a" } ], "metadata": { From 5679ecbda123be87c10efc851e15028a5ce2c4ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 2 Jul 2025 15:39:07 +0200 Subject: [PATCH 16/26] add comparison notebook --- .../Si_vs_effective_Si.ipynb | 328 +++++++++ .../alpha_kin_comparison.ipynb | 662 ------------------ 2 files changed, 328 insertions(+), 662 deletions(-) create mode 100644 examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb delete mode 100644 examples/PySDM_examples/Jouzel_and_Merlivat_1984/alpha_kin_comparison.ipynb diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb new file mode 100644 index 0000000000..a750226814 --- /dev/null +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb @@ -0,0 +1,328 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "[![preview 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/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb)\n", + "[![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb)\n", + "[![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/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb)" + ], + "id": "daf61c91cad1c865" + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# Comparison between saturation wrt. ice and effective saturation - based on [Jouzel and Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749) \"_Deuterium and oxygen 18 in precipitation: Modeling of the isotopic effects during snow formation_\"\n", + "eq. (13)" + ], + "id": "9e0070d460275191" + }, + { + "metadata": { + "ExecuteTime": { + "start_time": "2025-07-02T13:39:03.791057Z" + } + }, + "cell_type": "code", + "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')" + ], + "id": "d724e98702724300", + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-07-02T13:38:10.894204Z", + "start_time": "2025-07-02T13:38:09.003268Z" + } + }, + "cell_type": "code", + "source": [ + "from matplotlib import pyplot\n", + "import numpy as np\n", + "from open_atmos_jupyter_utils import show_plot\n", + "\n", + "from PySDM import Formulae\n", + "from PySDM.physics import si\n", + "from PySDM.physics.constants import PER_MILLE, in_unit" + ], + "id": "initial_id", + "outputs": [], + "execution_count": 2 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-02T13:38:10.976530Z", + "start_time": "2025-07-02T13:38:10.974834Z" + } + }, + "cell_type": "code", + "source": "any_number = 44", + "id": "a5f9f81ce8a0ef42", + "outputs": [], + "execution_count": 3 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-02T13:38:11.008707Z", + "start_time": "2025-07-02T13:38:10.986082Z" + } + }, + "cell_type": "code", + "source": [ + "formulae= Formulae(\n", + " latent_heat_vapourisation=\"Lowe2019\",\n", + " saturation_vapour_pressure=\"MurphyKoop2005\",\n", + " isotope_diffusivity_ratios=\"Stewart1975\",\n", + " isotope_kinetic_fractionation_factors=\"JouzelAndMerlivat1984\",\n", + " isotope_equilibrium_fractionation_factors=\"MerlivatAndNief1967+Majoube1970\",\n", + " diffusion_thermics=\"Neglect\",\n", + ")\n", + "const = formulae.constants\n", + "K2C = formulae.trivia.K2C\n", + "\n", + "diffusivity_ratio = {}\n", + "alpha_eq = {}\n", + "alpha_kinetic = {}\n", + "isotopes = (\"2H\", \"18O\")\n", + "for isotope in isotopes:\n", + " alpha_eq[isotope] = getattr(formulae.isotope_equilibrium_fractionation_factors, f'alpha_i_{isotope}')\n", + " diffusivity_ratio[isotope] = getattr(formulae.isotope_diffusivity_ratios, f'ratio_{isotope}_heavy_to_light')" + ], + "id": "bcad8d46c3f5e984", + "outputs": [], + "execution_count": 4 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-02T13:38:13.541102Z", + "start_time": "2025-07-02T13:38:11.018637Z" + } + }, + "cell_type": "code", + "source": [ + "isotope_considered = '2H'\n", + "temperature = np.linspace(300, 225, 10) * si.K\n", + "\n", + "saturation_wrt_ice = (\n", + " formulae.saturation_vapour_pressure.pvs_water(temperature)\n", + " / formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", + ")\n", + "\n", + "D_ratio = diffusivity_ratio[isotope_considered](temperature)\n", + "alpha_equilibrium = alpha_eq[isotope_considered](temperature)\n", + "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = saturation_wrt_ice\n", + " )\n", + "\n", + "K = formulae.diffusion_thermics.K(T=temperature, p=any_number)\n", + "D_light = formulae.diffusion_thermics.D(T=temperature, p=any_number)\n", + "\n", + "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", + "Fk = formulae.drop_growth.Fk(\n", + " T=temperature,\n", + " K=K,\n", + " lv=lv\n", + ")\n", + "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", + "\n", + "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(\n", + " D=D_light,\n", + " Fk=Fk/const.rho_w * rho_s\n", + ")\n", + "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", + " transfer_coefficient=A,\n", + " RH=saturation_wrt_ice\n", + ")\n", + "eff_alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", + " alpha_equilibrium = alpha_equilibrium,\n", + " D_ratio_heavy_to_light=D_ratio,\n", + " saturation = eff_saturation\n", + " )" + ], + "id": "ae040f63f5118298", + "outputs": [], + "execution_count": 5 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-02T13:38:33.219511Z", + "start_time": "2025-07-02T13:38:32.809408Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(K2C(temperature), alpha_kinetic, label=\"with Si\")\n", + "pyplot.plot(K2C(temperature), eff_alpha_kinetic, label=\"with effective Si\")\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " title=\"Kinetic Fractionation Factors of Temperature\",\n", + " xlabel=\"temperature [C]\",\n", + " ylabel=\"$\\\\alpha_{{kinetic}}$ [ ]\",\n", + ")\n", + "pyplot.grid()\n", + "show_plot('alpha_kinetic_of_temperature')" + ], + "id": "49fc37c3975214ab", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T15:38:33.201416\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "d7b71b420aa649058cc58a45a5e05f2c" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 7 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-02T13:38:36.803630Z", + "start_time": "2025-07-02T13:38:36.599032Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(K2C(temperature), saturation_wrt_ice, label=\"Saturation wrt. ice\")\n", + "pyplot.plot(K2C(temperature), eff_saturation, label=\"Effective saturation wrt ice\")\n", + "pyplot.legend()\n", + "pyplot.gca().set(\n", + " title=\"Saturation Fractionation Factors of Temperature\",\n", + " xlabel=\"temperature [C]\",\n", + " ylabel=\"saturation [ ]\",\n", + ")\n", + "pyplot.grid()\n", + "show_plot('saturation_of_temperature')" + ], + "id": "aed6a85080b0c92c", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T15:38:36.779039\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./saturation_of_temperatu…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "2ca6bdbe9f8b45fd9cb7833b5f6a44a7" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 8 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-02T13:38:38.939105Z", + "start_time": "2025-07-02T13:38:38.762636Z" + } + }, + "cell_type": "code", + "source": [ + "pyplot.plot(K2C(temperature), abs(saturation_wrt_ice - eff_saturation))\n", + "pyplot.grid()\n", + "pyplot.gca().set(\n", + " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", + " xlabel=\"temperature [C]\",\n", + " ylabel=\"$|Si - S_{{eff}}|$ [ ]\",\n", + ")\n", + "show_plot(\"Si_minus_effective_Si\")" + ], + "id": "50713009314f8a4d", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T15:38:38.917634\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Si_minus_effective_Si.pdf" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:26:31.705370\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "e6b2b91e3fca40a78e12f9279e44dcec" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 140 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:21:42.885690Z", - "start_time": "2025-06-26T18:21:42.873547Z" - } - }, - "cell_type": "code", - "source": [ - "iso = '2H'\n", - "temperature = np.linspace(300, 225, 10) * si.K\n", - "saturation= ice_saturation_curve_4(const=const, T=temperature)\n", - "D_ratio = diffusivity_ratio[iso](temperature)\n", - "alpha_equilibrium = alpha_eq[iso](temperature)\n", - "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", - " alpha_equilibrium = alpha_equilibrium,\n", - " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = saturation\n", - " )\n", - "K = const.K0\n", - "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", - "ls = formulae.latent_heat_sublimation.ls(temperature)\n", - "Fk = formulae.drop_growth.Fk(T=temperature, K=K, lv=ls)\n", - "D_light = const.D0\n", - "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", - "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D=D_light, Fk=Fk/const.rho_w * rho_s)\n", - "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient=A, RH=saturation)\n", - "alpha_kinetic_eff = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", - " alpha_equilibrium = alpha_equilibrium,\n", - " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = eff_saturation\n", - " )" - ], - "id": "89c8cff2d2b25160", - "outputs": [], - "execution_count": 131 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:21:43.635172Z", - "start_time": "2025-06-26T18:21:43.460528Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(temperature, alpha_kinetic, label=\"with Si\")\n", - "pyplot.plot(temperature, alpha_kinetic_eff, label=\"with S_eff\")\n", - "pyplot.legend()\n", - "pyplot.gca().set(\n", - " xlabel=\"temperature\",\n", - " ylabel=\"$\\\\alpha$\",\n", - ")\n", - "pyplot.grid()\n", - "show_plot('alpha_kinetic')" - ], - "id": "ce09807c50d4242d", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:21:43.621157\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "8b5754396baa488483374e0487e16fc2" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 132 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:21:52.036310Z", - "start_time": "2025-06-26T18:21:51.884225Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(saturation, alpha_kinetic, label=\"with Si\")\n", - "pyplot.plot(saturation, alpha_kinetic_eff, label=\"with S_eff\")\n", - "pyplot.legend()\n", - "pyplot.gca().set(\n", - " xlabel=\"S\",\n", - " ylabel=\"$\\\\alpha$\",\n", - ")\n", - "pyplot.grid()\n", - "show_plot('alpha_kinetic')" - ], - "id": "7e55c2745ba63c49", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:21:52.023179\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "c2e3e406b07244aeb9048b72127454ec" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 133 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:21:59.437794Z", - "start_time": "2025-06-26T18:21:59.432790Z" - } - }, - "cell_type": "code", - "source": [ - "cp = 1885 * si.joule / si.kilogram / si.K\n", - "q_s = 1\n", - "drop_temperature = temperature - ls / cp * (1 - saturation) * D_light / K * q_s / A" - ], - "id": "d2b5ece731ef507d", - "outputs": [], - "execution_count": 134 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:22:00.130776Z", - "start_time": "2025-06-26T18:22:00.063740Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(temperature, drop_temperature)\n", - "pyplot.plot(temperature, temperature, '--')\n", - "pyplot.grid()" - ], - "id": "6bc3f1e45bcc2cfc", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:00.119907\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 135 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:22:01.637627Z", - "start_time": "2025-06-26T18:22:01.574159Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(temperature, drop_temperature-temperature)\n", - "pyplot.grid()" - ], - "id": "7663dc1bca8593d", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:01.625395\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 136 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:22:02.464586Z", - "start_time": "2025-06-26T18:22:02.459734Z" - } - }, - "cell_type": "code", - "source": "", - "id": "de3209afcdf0f90c", - "outputs": [], - "execution_count": null - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:22:03.069180Z", - "start_time": "2025-06-26T18:22:03.057634Z" - } - }, - "cell_type": "code", - "source": [ - "\n", - "temperature = np.linspace(300, 225, 10) * si.K\n", - "saturation_wrt_ice = formulae.saturation_vapour_pressure.pvs_water(temperature)/formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", - "print(formulae.saturation_vapour_pressure.pvs_water(temperature))\n", - "D_ratio = diffusivity_ratio[iso](temperature)\n", - "alpha_equilibrium = alpha_eq[iso](temperature)\n", - "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", - " alpha_equilibrium = alpha_equilibrium,\n", - " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = saturation_wrt_ice\n", - " )\n", - "K = const.K0\n", - "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", - "ls = formulae.latent_heat_sublimation.ls(temperature)\n", - "Fk = formulae.drop_growth.Fk(T=temperature, K=K, lv=ls)\n", - "D_light = const.D0\n", - "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", - "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(D=D_light, Fk=Fk/const.rho_w * rho_s)\n", - "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(transfer_coefficient=A, RH=saturation_wrt_ice)\n", - "alpha_kinetic_eff = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", - " alpha_equilibrium = alpha_equilibrium,\n", - " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = eff_saturation\n", - " )" - ], - "id": "ae040f63f5118298", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[3536.76441305 2132.90307391 1243.42896172 698.45958047 376.66801387\n", - " 194.22282511 95.30126979 44.23776275 19.27605025 7.80625087]\n" - ] - } - ], - "execution_count": 137 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:22:04.499054Z", - "start_time": "2025-06-26T18:22:04.345541Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(temperature, alpha_kinetic, label=\"with Si\")\n", - "pyplot.plot(temperature, alpha_kinetic_eff, label=\"with S_eff\")\n", - "pyplot.legend()\n", - "pyplot.gca().set(\n", - " xlabel=\"temperature\",\n", - " ylabel=\"$\\\\alpha$\",\n", - ")\n", - "pyplot.grid()\n", - "show_plot('alpha_kinetic')" - ], - "id": "49fc37c3975214ab", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:04.485868\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "590c2dfb2a634b8b9d105332bc1321de" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 138 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:22:07.452200Z", - "start_time": "2025-06-26T18:22:07.319946Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(temperature, saturation_wrt_ice, label=\"Si\")\n", - "pyplot.plot(temperature, eff_saturation, label=\"S_eff\")\n", - "pyplot.legend()\n", - "pyplot.gca().set(\n", - " xlabel=\"temperature\",\n", - " ylabel=\"S\",\n", - ")\n", - "pyplot.grid()\n", - "show_plot('alpha_kinetic')" - ], - "id": "aed6a85080b0c92c", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T20:22:07.437913\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic.pdf
\"), HTML(v…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "df7f830b7f2c479695ca1d5e214565b0" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 139 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:19:06.207227Z", - "start_time": "2025-06-26T15:31:12.603552Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(K2C(temperature), saturation_wrt_ice - eff_saturation)\n", - "pyplot.grid()" - ], - "id": "50713009314f8a4d", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T17:31:13.035337\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 116 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-26T18:19:06.207444Z", - "start_time": "2025-06-26T15:43:29.545239Z" - } - }, - "cell_type": "code", - "source": [ - "pvs_water = formulae.saturation_vapour_pressure.pvs_water(temperature)\n", - "pvs_ice = formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", - "pyplot.plot(temperature,pvs_water)\n", - "pyplot.plot(temperature, pvs_ice)\n", - "pyplot.plot(temperature, pvs_water-pvs_ice)\n", - "py" - ], - "id": "cab9b5d3df23f632", - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T17:43:29.650667\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 120 - }, - { - "metadata": {}, - "cell_type": "code", - "outputs": [], - "execution_count": null, - "source": "", - "id": "eb3f1afea4b80f7a" - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 9d9c443dfb7868f76439d3d5ed6e754d5cbc5d31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Wed, 2 Jul 2025 16:30:53 +0200 Subject: [PATCH 17/26] add simple smoke test --- .../Si_vs_effective_Si.ipynb | 58 ++++++++++--------- .../test_Si_vs_effective_Si.py | 56 ++++++++++++++++++ 2 files changed, 86 insertions(+), 28 deletions(-) create mode 100644 tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb index a750226814..1414c89717 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb @@ -22,7 +22,8 @@ { "metadata": { "ExecuteTime": { - "start_time": "2025-07-02T13:39:03.791057Z" + "end_time": "2025-07-02T14:26:03.476998Z", + "start_time": "2025-07-02T14:26:03.439434Z" } }, "cell_type": "code", @@ -35,14 +36,14 @@ ], "id": "d724e98702724300", "outputs": [], - "execution_count": 1 + "execution_count": 2 }, { "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-07-02T13:38:10.894204Z", - "start_time": "2025-07-02T13:38:09.003268Z" + "end_time": "2025-07-02T14:26:05.419777Z", + "start_time": "2025-07-02T14:26:03.486767Z" } }, "cell_type": "code", @@ -57,26 +58,26 @@ ], "id": "initial_id", "outputs": [], - "execution_count": 2 + "execution_count": 3 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T13:38:10.976530Z", - "start_time": "2025-07-02T13:38:10.974834Z" + "end_time": "2025-07-02T14:26:05.433878Z", + "start_time": "2025-07-02T14:26:05.431720Z" } }, "cell_type": "code", "source": "any_number = 44", "id": "a5f9f81ce8a0ef42", "outputs": [], - "execution_count": 3 + "execution_count": 4 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T13:38:11.008707Z", - "start_time": "2025-07-02T13:38:10.986082Z" + "end_time": "2025-07-02T14:26:05.465713Z", + "start_time": "2025-07-02T14:26:05.443755Z" } }, "cell_type": "code", @@ -102,19 +103,19 @@ ], "id": "bcad8d46c3f5e984", "outputs": [], - "execution_count": 4 + "execution_count": 5 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T13:38:13.541102Z", - "start_time": "2025-07-02T13:38:11.018637Z" + "end_time": "2025-07-02T14:26:08.053416Z", + "start_time": "2025-07-02T14:26:05.472675Z" } }, "cell_type": "code", "source": [ "isotope_considered = '2H'\n", - "temperature = np.linspace(300, 225, 10) * si.K\n", + "temperature = np.linspace(225, 300, 10) * si.K\n", "\n", "saturation_wrt_ice = (\n", " formulae.saturation_vapour_pressure.pvs_water(temperature)\n", @@ -156,13 +157,13 @@ ], "id": "ae040f63f5118298", "outputs": [], - "execution_count": 5 + "execution_count": 6 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T13:38:33.219511Z", - "start_time": "2025-07-02T13:38:32.809408Z" + "end_time": "2025-07-02T14:26:08.511063Z", + "start_time": "2025-07-02T14:26:08.066827Z" } }, "cell_type": "code", @@ -185,7 +186,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T15:38:33.201416\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T16:26:08.491385\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -198,7 +199,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "d7b71b420aa649058cc58a45a5e05f2c" + "model_id": "019eba60fa8d4a2290831b28341d8d94" } }, "metadata": {}, @@ -210,8 +211,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T13:38:36.803630Z", - "start_time": "2025-07-02T13:38:36.599032Z" + "end_time": "2025-07-02T14:26:08.770593Z", + "start_time": "2025-07-02T14:26:08.538127Z" } }, "cell_type": "code", @@ -234,7 +235,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T15:38:36.779039\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T16:26:08.751989\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -247,7 +248,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "2ca6bdbe9f8b45fd9cb7833b5f6a44a7" + "model_id": "066046372e7a4aaab9581f46fd8848a4" } }, "metadata": {}, @@ -259,13 +260,14 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T13:38:38.939105Z", - "start_time": "2025-07-02T13:38:38.762636Z" + "end_time": "2025-07-02T14:26:08.954558Z", + "start_time": "2025-07-02T14:26:08.781141Z" } }, "cell_type": "code", "source": [ - "pyplot.plot(K2C(temperature), abs(saturation_wrt_ice - eff_saturation))\n", + "diff = saturation_wrt_ice - eff_saturation\n", + "pyplot.plot(K2C(temperature), abs(diff))\n", "pyplot.grid()\n", "pyplot.gca().set(\n", " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", @@ -281,7 +283,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T15:38:38.917634\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T16:26:08.938494\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -294,7 +296,7 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "5e928b1e95d445d69a9953bbfc7501fa" + "model_id": "bf955f00f69e4eec8d293e172915eb23" } }, "metadata": {}, diff --git a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py new file mode 100644 index 0000000000..03cfeafb4a --- /dev/null +++ b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py @@ -0,0 +1,56 @@ +""" """ + +from pathlib import Path +import pytest +import numpy as np +from open_atmos_jupyter_utils import notebook_vars +from PySDM_examples import Jouzel_and_Merlivat_1984 + +PLOT = False + + +@pytest.fixture(scope="session", name="notebook_variables") +def notebook_variables_fixture(): + return notebook_vars( + file=Path(Jouzel_and_Merlivat_1984.__file__).parent + / "Si_vs_effective_Si.ipynb", + plot=PLOT, + ) + + +class TestSiVsEffectiveSi: + @staticmethod + def test_alpha_kinetic_of_temperature_values(notebook_variables): + # arrange + temperature = notebook_variables["temperature"] + alpha_eff = notebook_variables["eff_alpha_kinetic"] + alpha = notebook_variables["alpha_kinetic"] + temp_below_0C = temperature <= 273.15 + + # act + sut = alpha_eff[temp_below_0C] + + # assert + np.testing.assert_array_less(sut, 1) + np.testing.assert_array_less(alpha[temp_below_0C], alpha_eff[temp_below_0C]) + + @staticmethod + @pytest.mark.parametrize("temperature_C, expected", ((-20, 0.05),)) + def test_max_difference(notebook_variables, temperature_C, expected): + # arrange + diff = notebook_variables["diff"] + temp = notebook_variables["temperature"] + temp_C = temp - 273.15 + temp_C_tolerance = 1 + + # act + diff_max = np.max(diff) + temp_C_range_max = temp_C[np.isclose(diff, diff_max, rtol=0.1)] + + # assert + assert diff_max <= expected + assert ( + np.min(temp_C_range_max) - temp_C_tolerance + <= temperature_C + <= np.max(temp_C_range_max) + temp_C_tolerance + ) From b1682d3189e479f481bac766c4136acc7bf3867f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 3 Jul 2025 14:42:33 +0200 Subject: [PATCH 18/26] rename file to proper fig number from paper; add test for values on the plot --- docs/bibliography.json | 3 +- .../{Si_vs_effective_Si.ipynb => fig_8.ipynb} | 99 ++++++++++--------- .../test_Si_vs_effective_Si.py | 56 ----------- .../jouzel_and_merlivat_1984/test_fig_8.py | 97 ++++++++++++++++++ 4 files changed, 150 insertions(+), 105 deletions(-) rename examples/PySDM_examples/Jouzel_and_Merlivat_1984/{Si_vs_effective_Si.ipynb => fig_8.ipynb} (65%) delete mode 100644 tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py create mode 100644 tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py diff --git a/docs/bibliography.json b/docs/bibliography.json index 337dc2a2b6..39caa699ef 100644 --- a/docs/bibliography.json +++ b/docs/bibliography.json @@ -881,7 +881,8 @@ "examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb", "examples/PySDM_examples/Jouzel_and_Merlivat_1984/thermodynamic_profiles.py", "tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py", - "examples/PySDM_examples/Fisher_1991/__init__.py" + "examples/PySDM_examples/Fisher_1991/__init__.py", + "tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py" ], "title": "Deuterium and oxygen 18 in precipitation: Modeling of the isotopic effects during snow formation", "label": "Jouzel & Merlivat 1984 (J. Geophys. Res. Atmos. 89)" diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb similarity index 65% rename from examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb rename to examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb index 1414c89717..4914d869f5 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb @@ -22,8 +22,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T14:26:03.476998Z", - "start_time": "2025-07-02T14:26:03.439434Z" + "end_time": "2025-07-03T12:27:02.868763Z", + "start_time": "2025-07-03T12:27:02.861683Z" } }, "cell_type": "code", @@ -36,14 +36,14 @@ ], "id": "d724e98702724300", "outputs": [], - "execution_count": 2 + "execution_count": 6 }, { "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-07-02T14:26:05.419777Z", - "start_time": "2025-07-02T14:26:03.486767Z" + "end_time": "2025-07-03T12:27:02.882299Z", + "start_time": "2025-07-03T12:27:02.880178Z" } }, "cell_type": "code", @@ -58,26 +58,26 @@ ], "id": "initial_id", "outputs": [], - "execution_count": 3 + "execution_count": 7 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T14:26:05.433878Z", - "start_time": "2025-07-02T14:26:05.431720Z" + "end_time": "2025-07-03T12:27:02.896874Z", + "start_time": "2025-07-03T12:27:02.895381Z" } }, "cell_type": "code", "source": "any_number = 44", "id": "a5f9f81ce8a0ef42", "outputs": [], - "execution_count": 4 + "execution_count": 8 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T14:26:05.465713Z", - "start_time": "2025-07-02T14:26:05.443755Z" + "end_time": "2025-07-03T12:27:02.911786Z", + "start_time": "2025-07-03T12:27:02.906702Z" } }, "cell_type": "code", @@ -103,13 +103,13 @@ ], "id": "bcad8d46c3f5e984", "outputs": [], - "execution_count": 5 + "execution_count": 9 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T14:26:08.053416Z", - "start_time": "2025-07-02T14:26:05.472675Z" + "end_time": "2025-07-03T12:27:02.924456Z", + "start_time": "2025-07-03T12:27:02.920716Z" } }, "cell_type": "code", @@ -117,6 +117,7 @@ "isotope_considered = '2H'\n", "temperature = np.linspace(225, 300, 10) * si.K\n", "\n", + "relative_humidity = 1/formulae.saturation_vapour_pressure.pvs_water(temperature)\n", "saturation_wrt_ice = (\n", " formulae.saturation_vapour_pressure.pvs_water(temperature)\n", " / formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", @@ -145,48 +146,50 @@ " D=D_light,\n", " Fk=Fk/const.rho_w * rho_s\n", ")\n", - "eff_saturation = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", + "eff_saturation_wrt_ice = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", " transfer_coefficient=A,\n", " RH=saturation_wrt_ice\n", ")\n", "eff_alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_equilibrium,\n", " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = eff_saturation\n", + " saturation = eff_saturation_wrt_ice\n", " )" ], "id": "ae040f63f5118298", "outputs": [], - "execution_count": 6 + "execution_count": 10 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T14:26:08.511063Z", - "start_time": "2025-07-02T14:26:08.066827Z" + "end_time": "2025-07-03T12:27:03.343721Z", + "start_time": "2025-07-03T12:27:02.958183Z" } }, "cell_type": "code", "source": [ - "pyplot.plot(K2C(temperature), alpha_kinetic, label=\"with Si\")\n", - "pyplot.plot(K2C(temperature), eff_alpha_kinetic, label=\"with effective Si\")\n", + "pyplot.plot(K2C(temperature), saturation_wrt_ice, 'k', label=\"Saturation wrt ice\")\n", + "pyplot.plot(K2C(temperature), eff_saturation_wrt_ice, 'k--',label=\"Effective saturation wrt ice\")\n", "pyplot.legend()\n", "pyplot.gca().set(\n", - " title=\"Kinetic Fractionation Factors of Temperature\",\n", + " title=\"Saturation wrt ice\",\n", " xlabel=\"temperature [C]\",\n", - " ylabel=\"$\\\\alpha_{{kinetic}}$ [ ]\",\n", + " ylabel=\"Si [ ]\",\n", + " xlim=(0, -50),\n", + " ylim=(1, 1.7)\n", ")\n", "pyplot.grid()\n", - "show_plot('alpha_kinetic_of_temperature')" + "show_plot('fig_8')" ], - "id": "49fc37c3975214ab", + "id": "aed6a85080b0c92c", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T16:26:08.491385\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T14:27:03.327221\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -194,48 +197,48 @@ { "data": { "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" + "HBox(children=(HTML(value=\"./fig_8.pdf
\"), HTML(value=\"" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T16:26:08.751989\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T14:27:03.579859\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -243,31 +246,31 @@ { "data": { "text/plain": [ - "HBox(children=(HTML(value=\"./saturation_of_temperatu…" + "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" ], "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "066046372e7a4aaab9581f46fd8848a4" + "model_id": "8a3d282b8c704112a99b9dfc0b87f84f" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 8 + "execution_count": 12 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-02T14:26:08.954558Z", - "start_time": "2025-07-02T14:26:08.781141Z" + "end_time": "2025-07-03T12:27:03.763835Z", + "start_time": "2025-07-03T12:27:03.616996Z" } }, "cell_type": "code", "source": [ - "diff = saturation_wrt_ice - eff_saturation\n", - "pyplot.plot(K2C(temperature), abs(diff))\n", + "saturation_difference = saturation_wrt_ice - eff_saturation_wrt_ice\n", + "pyplot.plot(K2C(temperature), abs(saturation_difference))\n", "pyplot.grid()\n", "pyplot.gca().set(\n", " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", @@ -283,7 +286,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-02T16:26:08.938494\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T14:27:03.746416\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -296,14 +299,14 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "bf955f00f69e4eec8d293e172915eb23" + "model_id": "7351a49ecf744e5b874809724b1fc5b3" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 9 + "execution_count": 13 } ], "metadata": { diff --git a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py deleted file mode 100644 index 03cfeafb4a..0000000000 --- a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py +++ /dev/null @@ -1,56 +0,0 @@ -""" """ - -from pathlib import Path -import pytest -import numpy as np -from open_atmos_jupyter_utils import notebook_vars -from PySDM_examples import Jouzel_and_Merlivat_1984 - -PLOT = False - - -@pytest.fixture(scope="session", name="notebook_variables") -def notebook_variables_fixture(): - return notebook_vars( - file=Path(Jouzel_and_Merlivat_1984.__file__).parent - / "Si_vs_effective_Si.ipynb", - plot=PLOT, - ) - - -class TestSiVsEffectiveSi: - @staticmethod - def test_alpha_kinetic_of_temperature_values(notebook_variables): - # arrange - temperature = notebook_variables["temperature"] - alpha_eff = notebook_variables["eff_alpha_kinetic"] - alpha = notebook_variables["alpha_kinetic"] - temp_below_0C = temperature <= 273.15 - - # act - sut = alpha_eff[temp_below_0C] - - # assert - np.testing.assert_array_less(sut, 1) - np.testing.assert_array_less(alpha[temp_below_0C], alpha_eff[temp_below_0C]) - - @staticmethod - @pytest.mark.parametrize("temperature_C, expected", ((-20, 0.05),)) - def test_max_difference(notebook_variables, temperature_C, expected): - # arrange - diff = notebook_variables["diff"] - temp = notebook_variables["temperature"] - temp_C = temp - 273.15 - temp_C_tolerance = 1 - - # act - diff_max = np.max(diff) - temp_C_range_max = temp_C[np.isclose(diff, diff_max, rtol=0.1)] - - # assert - assert diff_max <= expected - assert ( - np.min(temp_C_range_max) - temp_C_tolerance - <= temperature_C - <= np.max(temp_C_range_max) + temp_C_tolerance - ) diff --git a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py new file mode 100644 index 0000000000..33fc4ee32d --- /dev/null +++ b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py @@ -0,0 +1,97 @@ +""" +tests for fig. 8 from [Jouzel & Merlivat 1984 (J. Geophys. Res. Atmos. 89)](https://doi.org/10.1029/JD089iD07p11749) +""" # pylint: disable=line-too-long + +from pathlib import Path +import pytest +import numpy as np +from open_atmos_jupyter_utils import notebook_vars +from PySDM.physics.constants import T0 +from PySDM_examples import Jouzel_and_Merlivat_1984 + +PLOT = False + + +@pytest.fixture(scope="session", name="notebook_variables") +def notebook_variables_fixture(): + return notebook_vars( + file=Path(Jouzel_and_Merlivat_1984.__file__).parent / "fig_8.ipynb", + plot=PLOT, + ) + + +class TestFig8: + @staticmethod + @pytest.mark.parametrize( + "if_effective, temp_C, value", + ( + (False, 0, 1), + (False, -10, 1.1), + (False, -20, 1.22), + (False, -30, 1.34), + (False, -45, 1.54), + (True, 0, 1), + (True, -10, 1.08), + (True, -20, 1.18), + (True, -30, 1.30), + (True, -45, 1.52), + ), + ) + def test_fig8_values_against_the_paper( + notebook_variables, if_effective, temp_C, value + ): + # arrange + temperature_C = notebook_variables["temperature"] - T0 + if if_effective: + Si = notebook_variables["eff_saturation_wrt_ice"] + else: + Si = notebook_variables["saturation_wrt_ice"] + + # act + sut = Si[np.argmin(np.abs(temperature_C - temp_C))] + + # assert + np.testing.assert_approx_equal(sut, value, significant=1) + + @staticmethod + @pytest.mark.parametrize("temperature_C, expected", ((-20, 0.05),)) + def test_fig_8_max_difference(notebook_variables, temperature_C, expected): + """ + Test maximum difference between saturation and effective saturation over ice. + Based on comment the on eq. (13) + in [Jouzel & Merlivat 1984 (J. Geophys. Res. Atmos. 89)](https://doi.org/10.1029/JD089iD07p11749) + """ # pylint: disable=line-too-long + # arrange + saturation_difference = notebook_variables["saturation_difference"] + temp = notebook_variables["temperature"] + temp_C = temp - T0 + temp_C_tolerance = 0.01 + + # act + max_difference = np.max(saturation_difference) + temp_C_range_max = temp_C[ + np.isclose(saturation_difference, max_difference, rtol=0.1) + ] + + # assert + assert max_difference <= expected + assert ( + np.min(temp_C_range_max) - temp_C_tolerance + <= temperature_C + <= np.max(temp_C_range_max) + temp_C_tolerance + ) + + @staticmethod + def test_alpha_kinetic_of_temperature_values(notebook_variables): + # arrange + temperature = notebook_variables["temperature"] + alpha_eff = notebook_variables["eff_alpha_kinetic"] + alpha = notebook_variables["alpha_kinetic"] + temp_below_0C = temperature <= T0 + + # act + sut = alpha_eff[temp_below_0C] + + # assert + np.testing.assert_array_less(sut, 1) + np.testing.assert_array_less(alpha[temp_below_0C], alpha_eff[temp_below_0C]) From 2549a346d3eaeca3ce6852760161e0a327cb301a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 3 Jul 2025 15:19:45 +0200 Subject: [PATCH 19/26] compress fig8 with fig9 --- docs/bibliography.json | 2 +- .../Jouzel_and_Merlivat_1984/fig_8.ipynb | 333 ------------------ .../Jouzel_and_Merlivat_1984/fig_8_9.ipynb | 304 +++++++++++++--- .../jouzel_and_merlivat_1984/test_fig_8.py | 14 +- 4 files changed, 262 insertions(+), 391 deletions(-) delete mode 100644 examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb diff --git a/docs/bibliography.json b/docs/bibliography.json index 39caa699ef..fafca06568 100644 --- a/docs/bibliography.json +++ b/docs/bibliography.json @@ -882,7 +882,7 @@ "examples/PySDM_examples/Jouzel_and_Merlivat_1984/thermodynamic_profiles.py", "tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py", "examples/PySDM_examples/Fisher_1991/__init__.py", - "tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_Si_vs_effective_Si.py" + "tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py" ], "title": "Deuterium and oxygen 18 in precipitation: Modeling of the isotopic effects during snow formation", "label": "Jouzel & Merlivat 1984 (J. Geophys. Res. Atmos. 89)" diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb deleted file mode 100644 index 4914d869f5..0000000000 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8.ipynb +++ /dev/null @@ -1,333 +0,0 @@ -{ - "cells": [ - { - "metadata": {}, - "cell_type": "markdown", - "source": [ - "[![preview 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/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb)\n", - "[![launch on mybinder.org](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/open-atmos/PySDM.git/main?urlpath=lab/tree/examples/PySDM_examples/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb)\n", - "[![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/Jouzel_and_Merlivat_1984/Si_vs_effective_Si.ipynb)" - ], - "id": "daf61c91cad1c865" - }, - { - "metadata": {}, - "cell_type": "markdown", - "source": [ - "# Comparison between saturation wrt. ice and effective saturation - based on [Jouzel and Merlivat 1984](https://doi.org/10.1029/JD089iD07p11749) \"_Deuterium and oxygen 18 in precipitation: Modeling of the isotopic effects during snow formation_\"\n", - "eq. (13)" - ], - "id": "9e0070d460275191" - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T12:27:02.868763Z", - "start_time": "2025-07-03T12:27:02.861683Z" - } - }, - "cell_type": "code", - "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')" - ], - "id": "d724e98702724300", - "outputs": [], - "execution_count": 6 - }, - { - "metadata": { - "collapsed": true, - "ExecuteTime": { - "end_time": "2025-07-03T12:27:02.882299Z", - "start_time": "2025-07-03T12:27:02.880178Z" - } - }, - "cell_type": "code", - "source": [ - "from matplotlib import pyplot\n", - "import numpy as np\n", - "from open_atmos_jupyter_utils import show_plot\n", - "\n", - "from PySDM import Formulae\n", - "from PySDM.physics import si\n", - "from PySDM.physics.constants import PER_MILLE, in_unit" - ], - "id": "initial_id", - "outputs": [], - "execution_count": 7 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T12:27:02.896874Z", - "start_time": "2025-07-03T12:27:02.895381Z" - } - }, - "cell_type": "code", - "source": "any_number = 44", - "id": "a5f9f81ce8a0ef42", - "outputs": [], - "execution_count": 8 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T12:27:02.911786Z", - "start_time": "2025-07-03T12:27:02.906702Z" - } - }, - "cell_type": "code", - "source": [ - "formulae= Formulae(\n", - " latent_heat_vapourisation=\"Lowe2019\",\n", - " saturation_vapour_pressure=\"MurphyKoop2005\",\n", - " isotope_diffusivity_ratios=\"Stewart1975\",\n", - " isotope_kinetic_fractionation_factors=\"JouzelAndMerlivat1984\",\n", - " isotope_equilibrium_fractionation_factors=\"MerlivatAndNief1967+Majoube1970\",\n", - " diffusion_thermics=\"Neglect\",\n", - ")\n", - "const = formulae.constants\n", - "K2C = formulae.trivia.K2C\n", - "\n", - "diffusivity_ratio = {}\n", - "alpha_eq = {}\n", - "alpha_kinetic = {}\n", - "isotopes = (\"2H\", \"18O\")\n", - "for isotope in isotopes:\n", - " alpha_eq[isotope] = getattr(formulae.isotope_equilibrium_fractionation_factors, f'alpha_i_{isotope}')\n", - " diffusivity_ratio[isotope] = getattr(formulae.isotope_diffusivity_ratios, f'ratio_{isotope}_heavy_to_light')" - ], - "id": "bcad8d46c3f5e984", - "outputs": [], - "execution_count": 9 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T12:27:02.924456Z", - "start_time": "2025-07-03T12:27:02.920716Z" - } - }, - "cell_type": "code", - "source": [ - "isotope_considered = '2H'\n", - "temperature = np.linspace(225, 300, 10) * si.K\n", - "\n", - "relative_humidity = 1/formulae.saturation_vapour_pressure.pvs_water(temperature)\n", - "saturation_wrt_ice = (\n", - " formulae.saturation_vapour_pressure.pvs_water(temperature)\n", - " / formulae.saturation_vapour_pressure.pvs_ice(temperature)\n", - ")\n", - "\n", - "D_ratio = diffusivity_ratio[isotope_considered](temperature)\n", - "alpha_equilibrium = alpha_eq[isotope_considered](temperature)\n", - "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", - " alpha_equilibrium = alpha_equilibrium,\n", - " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = saturation_wrt_ice\n", - " )\n", - "\n", - "K = formulae.diffusion_thermics.K(T=temperature, p=any_number)\n", - "D_light = formulae.diffusion_thermics.D(T=temperature, p=any_number)\n", - "\n", - "lv = formulae.latent_heat_vapourisation.lv(temperature)\n", - "Fk = formulae.drop_growth.Fk(\n", - " T=temperature,\n", - " K=K,\n", - " lv=lv\n", - ")\n", - "rho_s = formulae.saturation_vapour_pressure.pvs_ice(temperature) / const.Rv / temperature\n", - "\n", - "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(\n", - " D=D_light,\n", - " Fk=Fk/const.rho_w * rho_s\n", - ")\n", - "eff_saturation_wrt_ice = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", - " transfer_coefficient=A,\n", - " RH=saturation_wrt_ice\n", - ")\n", - "eff_alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", - " alpha_equilibrium = alpha_equilibrium,\n", - " D_ratio_heavy_to_light=D_ratio,\n", - " saturation = eff_saturation_wrt_ice\n", - " )" - ], - "id": "ae040f63f5118298", - "outputs": [], - "execution_count": 10 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T12:27:03.343721Z", - "start_time": "2025-07-03T12:27:02.958183Z" - } - }, - "cell_type": "code", - "source": [ - "pyplot.plot(K2C(temperature), saturation_wrt_ice, 'k', label=\"Saturation wrt ice\")\n", - "pyplot.plot(K2C(temperature), eff_saturation_wrt_ice, 'k--',label=\"Effective saturation wrt ice\")\n", - "pyplot.legend()\n", - "pyplot.gca().set(\n", - " title=\"Saturation wrt ice\",\n", - " xlabel=\"temperature [C]\",\n", - " ylabel=\"Si [ ]\",\n", - " xlim=(0, -50),\n", - " ylim=(1, 1.7)\n", - ")\n", - "pyplot.grid()\n", - "show_plot('fig_8')" - ], - "id": "aed6a85080b0c92c", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T14:27:03.327221\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./fig_8.pdf
\"), HTML(value=\"" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T14:27:03.579859\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "8a3d282b8c704112a99b9dfc0b87f84f" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 12 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T12:27:03.763835Z", - "start_time": "2025-07-03T12:27:03.616996Z" - } - }, - "cell_type": "code", - "source": [ - "saturation_difference = saturation_wrt_ice - eff_saturation_wrt_ice\n", - "pyplot.plot(K2C(temperature), abs(saturation_difference))\n", - "pyplot.grid()\n", - "pyplot.gca().set(\n", - " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", - " xlabel=\"temperature [C]\",\n", - " ylabel=\"$|Si - S_{{eff}}|$ [ ]\",\n", - ")\n", - "show_plot(\"Si_minus_effective_Si\")" - ], - "id": "50713009314f8a4d", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T14:27:03.746416\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./Si_minus_effective_Si.pdf" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T01:25:44.970122\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.211025\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -133,45 +237,160 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "8c15bde98c9c4698979a4cb47ad75d48" + "model_id": "0eb6d20391bf4dacbf6c06a439ad7669" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 18 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-03T13:12:32.408909Z", + "start_time": "2025-07-03T13:12:32.248739Z" + } + }, + "cell_type": "code", + "source": [ + "saturation_difference = saturation_wrt_ice - eff_saturation_wrt_ice\n", + "pyplot.plot(K2C(T_0_50), abs(saturation_difference), 'g')\n", + "pyplot.grid()\n", + "pyplot.gca().set(\n", + " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", + " xlabel=\"temperature [C]\",\n", + " ylabel=\"$|Si - S_{{eff}}|$ [ ]\",\n", + ")\n", + "show_plot(\"Si_minus_effective_Si\")" + ], + "id": "2e95a50c723d4181", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.391863\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./Si_minus_effective_Si.pdf" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.565524\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "a71b79fcdf3e4e39853ad8dbb0e67178" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 4 + "execution_count": 20 + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "## Fig. 9: Effective fractionation factors\n", + "$\\alpha_{eff} = \\alpha_s\\alpha_k$\n", + "for $^{18}$O of saturation over ice" + ], + "id": "552c5304753132f5" }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T23:25:45.731460Z", - "start_time": "2025-06-25T23:25:44.995396Z" + "end_time": "2025-07-03T13:12:32.605388Z", + "start_time": "2025-07-03T13:12:32.602097Z" } }, "cell_type": "code", "source": [ "temperatures = C2K(np.array([-10., -20., -30.]))\n", + "isotope_considered = \"18O\"\n", + "\n", "alphas_eff = np.zeros((n_points, len(temperatures)))\n", "Si = np.linspace(1.0, 1.4, n_points)\n", "for i, T in enumerate(temperatures):\n", - " alpha_s = formulae.isotope_equilibrium_fractionation_factors.alpha_i_18O(T)\n", + " alpha_s = alpha_eq[isotope_considered](T)\n", " alpha_k = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium=alpha_s,\n", " saturation=Si,\n", - " D_ratio_heavy_to_light=formulae.isotope_diffusivity_ratios.ratio_18O_heavy_to_light(T)\n", + " D_ratio_heavy_to_light=diffusivity_ratio[isotope_considered](T),\n", " )\n", " alphas_eff[:, i] = alpha_k * alpha_s" ], "id": "1a7e5ae0c7093428", "outputs": [], - "execution_count": 5 + "execution_count": 21 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-06-25T23:25:45.959914Z", - "start_time": "2025-06-25T23:25:45.739364Z" + "end_time": "2025-07-03T13:12:32.781402Z", + "start_time": "2025-07-03T13:12:32.621724Z" } }, "cell_type": "code", @@ -180,14 +399,14 @@ " pyplot.plot(\n", " Si,\n", " alphas_eff[:, i],\n", - " label=f'{K2C(T):.5g} (C)',\n", - " color='k',\n", + " label=f'{K2C(T):.5g} [°C]',\n", + " color='g',\n", " linewidth = 1 + i/2\n", " )\n", "pyplot.gca().set(\n", " ylabel='$\\\\alpha_s\\\\alpha_k$',\n", " xlabel='Si',\n", - " title = \"$\\\\alpha_s\\\\alpha_k$ for $^{18}$O of saturation over ice\"\n", + " title = f\"Effective fractionation factors for {isotope_considered}\"\n", ")\n", "pyplot.grid()\n", "pyplot.legend()\n", @@ -200,7 +419,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-06-26T01:25:45.940460\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.763244\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -213,27 +432,14 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "a478d96b93d34ed2936063de54732783" + "model_id": "0501ac8ed30b49c49a0be9dbe35e4896" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 6 - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2025-06-25T23:25:45.972541Z", - "start_time": "2025-06-25T23:25:45.970842Z" - } - }, - "cell_type": "code", - "source": "", - "id": "94ff2c9e78541ae", - "outputs": [], - "execution_count": null + "execution_count": 22 } ], "metadata": { diff --git a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py index 33fc4ee32d..2294d00c2f 100644 --- a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py +++ b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py @@ -15,7 +15,7 @@ @pytest.fixture(scope="session", name="notebook_variables") def notebook_variables_fixture(): return notebook_vars( - file=Path(Jouzel_and_Merlivat_1984.__file__).parent / "fig_8.ipynb", + file=Path(Jouzel_and_Merlivat_1984.__file__).parent / "fig_8_9.ipynb", plot=PLOT, ) @@ -41,7 +41,7 @@ def test_fig8_values_against_the_paper( notebook_variables, if_effective, temp_C, value ): # arrange - temperature_C = notebook_variables["temperature"] - T0 + temperature_C = notebook_variables["T_0_50"] - T0 if if_effective: Si = notebook_variables["eff_saturation_wrt_ice"] else: @@ -63,7 +63,7 @@ def test_fig_8_max_difference(notebook_variables, temperature_C, expected): """ # pylint: disable=line-too-long # arrange saturation_difference = notebook_variables["saturation_difference"] - temp = notebook_variables["temperature"] + temp = notebook_variables["T_0_50"] temp_C = temp - T0 temp_C_tolerance = 0.01 @@ -82,16 +82,14 @@ def test_fig_8_max_difference(notebook_variables, temperature_C, expected): ) @staticmethod - def test_alpha_kinetic_of_temperature_values(notebook_variables): + def test_alpha_less_then_eff_alpha(notebook_variables): # arrange - temperature = notebook_variables["temperature"] alpha_eff = notebook_variables["eff_alpha_kinetic"] alpha = notebook_variables["alpha_kinetic"] - temp_below_0C = temperature <= T0 # act - sut = alpha_eff[temp_below_0C] + sut = alpha_eff # assert np.testing.assert_array_less(sut, 1) - np.testing.assert_array_less(alpha[temp_below_0C], alpha_eff[temp_below_0C]) + np.testing.assert_array_less(alpha, alpha_eff) From c0653812da1a913a8823c28b69307d73d6661472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 3 Jul 2025 23:07:59 +0200 Subject: [PATCH 20/26] change import order --- .../smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py index 2294d00c2f..af4a3679f8 100644 --- a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py +++ b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py @@ -6,8 +6,9 @@ import pytest import numpy as np from open_atmos_jupyter_utils import notebook_vars -from PySDM.physics.constants import T0 + from PySDM_examples import Jouzel_and_Merlivat_1984 +from PySDM.physics.constants import T0 PLOT = False From 1ba210e276421ef683f8928fd9159667de074280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Sun, 6 Jul 2025 22:14:11 +0200 Subject: [PATCH 21/26] some changes to naming and plot styles --- .../Jouzel_and_Merlivat_1984/fig_8_9.ipynb | 198 ++++++++---------- 1 file changed, 92 insertions(+), 106 deletions(-) diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb index 1f8aef62fb..a59c28a76d 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb @@ -23,8 +23,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:31.948539Z", - "start_time": "2025-07-03T13:12:31.935402Z" + "end_time": "2025-07-06T20:04:14.905723Z", + "start_time": "2025-07-06T20:04:14.900796Z" } }, "cell_type": "code", @@ -37,7 +37,7 @@ ], "id": "466d06cabb3174f3", "outputs": [], - "execution_count": 12 + "execution_count": 9 }, { "cell_type": "code", @@ -45,8 +45,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-07-03T13:12:31.958842Z", - "start_time": "2025-07-03T13:12:31.953591Z" + "end_time": "2025-07-06T20:04:14.925137Z", + "start_time": "2025-07-06T20:04:14.922741Z" } }, "source": [ @@ -58,18 +58,18 @@ "from open_atmos_jupyter_utils import show_plot" ], "outputs": [], - "execution_count": 13 + "execution_count": 10 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:31.994959Z", - "start_time": "2025-07-03T13:12:31.983552Z" + "end_time": "2025-07-06T20:04:14.947223Z", + "start_time": "2025-07-06T20:04:14.940365Z" } }, "cell_type": "code", "source": [ - "any_number = 44\n", + "ANY_NUMBER = 44\n", "\n", "formulae= Formulae(\n", " latent_heat_vapourisation=\"Lowe2019\",\n", @@ -87,15 +87,15 @@ "n_points = 100\n", "T_0_50 = C2K(np.linspace(0.0, -50, n_points))" ], - "id": "87e416d611926ad5", + "id": "6f7078d9d56a0a7c", "outputs": [], - "execution_count": 14 + "execution_count": 11 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.007354Z", - "start_time": "2025-07-03T13:12:32.005114Z" + "end_time": "2025-07-06T20:04:14.964248Z", + "start_time": "2025-07-06T20:04:14.957645Z" } }, "cell_type": "code", @@ -108,9 +108,9 @@ " alpha_eq[isotope] = getattr(formulae.isotope_equilibrium_fractionation_factors, f'alpha_i_{isotope}')\n", " diffusivity_ratio[isotope] = getattr(formulae.isotope_diffusivity_ratios, f'ratio_{isotope}_heavy_to_light')" ], - "id": "5249b42469926bfc", + "id": "2c7e390144e7499", "outputs": [], - "execution_count": 15 + "execution_count": 12 }, { "metadata": {}, @@ -121,42 +121,44 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.023183Z", - "start_time": "2025-07-03T13:12:32.020431Z" + "end_time": "2025-07-06T20:04:14.974512Z", + "start_time": "2025-07-06T20:04:14.971371Z" } }, "cell_type": "code", "source": [ - "saturation_wrt_ice = (\n", - " formulae.saturation_vapour_pressure.pvs_water(T_0_50)\n", - " / formulae.saturation_vapour_pressure.pvs_ice(T_0_50)\n", - ")\n", + "pvs_ice = formulae.saturation_vapour_pressure.pvs_ice\n", + "pvs_water = formulae.saturation_vapour_pressure.pvs_water\n", + "pressure = ANY_NUMBER\n", "\n", - "D_light = formulae.diffusion_thermics.D(T=T_0_50, p=any_number)\n", + "D_light = formulae.diffusion_thermics.D(T=T_0_50, p=pressure)\n", "Fk = formulae.drop_growth.Fk(\n", " T=T_0_50,\n", - " K=formulae.diffusion_thermics.K(T=T_0_50, p=any_number),\n", + " K=formulae.diffusion_thermics.K(T=T_0_50, p=pressure),\n", " lv=formulae.latent_heat_vapourisation.lv(T_0_50)\n", - ") / const.rho_w * formulae.saturation_vapour_pressure.pvs_ice(T_0_50) / const.Rv / T_0_50\n", + ") / const.rho_w * pvs_ice(T_0_50) / const.Rv / T_0_50 # TODO change A definition or call it differently\n", + "\n", + "\n", + "saturation_wrt_ice_at_RH100 = pvs_water(T_0_50) / pvs_ice(T_0_50)\n", "\n", - "A = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(\n", + "\n", + "eff_saturation_wrt_ice_at_RH100 = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", + " transfer_coefficient=formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(\n", " D=D_light,\n", " Fk=Fk\n", - ")\n", - "eff_saturation_wrt_ice = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", - " transfer_coefficient=A,\n", - " RH=saturation_wrt_ice\n", + "),\n", + " RH=saturation_wrt_ice_at_RH100\n", ")" ], - "id": "c915cc7a7b658abf", + "id": "47503ee93cc639b7", "outputs": [], - "execution_count": 16 + "execution_count": 13 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.046762Z", - "start_time": "2025-07-03T13:12:32.043433Z" + "end_time": "2025-07-06T20:04:14.984673Z", + "start_time": "2025-07-06T20:04:14.982519Z" } }, "cell_type": "code", @@ -165,49 +167,55 @@ "alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_eq[isotope_considered](T_0_50),\n", " D_ratio_heavy_to_light=diffusivity_ratio[isotope_considered](T_0_50),\n", - " saturation = saturation_wrt_ice\n", + " saturation = saturation_wrt_ice_at_RH100\n", " )\n", "\n", "eff_alpha_kinetic = formulae.isotope_kinetic_fractionation_factors.alpha_kinetic(\n", " alpha_equilibrium = alpha_eq[isotope_considered](T_0_50),\n", " D_ratio_heavy_to_light=diffusivity_ratio[isotope_considered](T_0_50),\n", - " saturation = eff_saturation_wrt_ice\n", + " saturation = eff_saturation_wrt_ice_at_RH100\n", " )" ], - "id": "2b2b7b44ca73464b", + "id": "ad049bb8d20fa39b", "outputs": [], - "execution_count": 17 + "execution_count": 14 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.228180Z", - "start_time": "2025-07-03T13:12:32.067039Z" + "end_time": "2025-07-06T20:09:04.656624Z", + "start_time": "2025-07-06T20:09:04.456285Z" } }, "cell_type": "code", "source": [ "pyplot.plot(\n", " K2C(T_0_50),\n", - " saturation_wrt_ice,\n", - " 'g',\n", - " label='saturation wrt ice',\n", + " saturation_wrt_ice_at_RH100,\n", + " 'k',\n", + " label='saturation wrt ice at RH100',\n", ")\n", "pyplot.plot(\n", " K2C(T_0_50),\n", - " eff_saturation_wrt_ice,\n", - " 'g--',\n", - " label=\"effective saturation wrt ice\"\n", + " pvs_ice(T_0_50),\n", + " 'b',\n", + " label='',\n", + ")\n", + "pyplot.plot(\n", + " K2C(T_0_50),\n", + " eff_saturation_wrt_ice_at_RH100,\n", + " 'k--',\n", + " label=\"effective saturation wrt ice at RH100\",\n", ")\n", "pyplot.plot(\n", " K2C(T_0_50)[n_points//5:],\n", " ice_saturation_curve_4(const,T_0_50[n_points//5:]),\n", - " 'k',\n", + " 'g',\n", " label='curve 4',\n", ")\n", "pyplot.legend()\n", "pyplot.gca().set(\n", - " title=f\"Saturation wrt ice for {isotope_considered}\",\n", + " title=f\"Saturation wrt ice for {isotope_considered} at RH=100\",\n", " xlabel=\"Temperature [°C]\",\n", " ylabel=\"Si [ ]\",\n", " xlim=(K2C(T_0_50[0]), K2C(T_0_50[-1])),\n", @@ -217,14 +225,14 @@ "pyplot.legend()\n", "show_plot('fig_8')" ], - "id": "3f97b336a478a65a", + "id": "fd51ae9370fec8d7", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.211025\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-06T22:09:04.639827\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -237,26 +245,26 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "0eb6d20391bf4dacbf6c06a439ad7669" + "model_id": "cc95c25f87184e01a8cc0712442e21bd" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 18 + "execution_count": 25 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.408909Z", - "start_time": "2025-07-03T13:12:32.248739Z" + "end_time": "2025-07-06T20:04:15.536558Z", + "start_time": "2025-07-06T20:04:15.173042Z" } }, "cell_type": "code", "source": [ - "saturation_difference = saturation_wrt_ice - eff_saturation_wrt_ice\n", - "pyplot.plot(K2C(T_0_50), abs(saturation_difference), 'g')\n", + "saturation_difference = saturation_wrt_ice_at_RH100 - eff_saturation_wrt_ice_at_RH100\n", + "pyplot.plot(K2C(T_0_50), abs(saturation_difference))\n", "pyplot.grid()\n", "pyplot.gca().set(\n", " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", @@ -265,14 +273,14 @@ ")\n", "show_plot(\"Si_minus_effective_Si\")" ], - "id": "2e95a50c723d4181", + "id": "2573a83fb26b7f0f", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.391863\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-06T22:04:15.520933\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -285,14 +293,14 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "4aa2eb17a4214eb280239987e6e15ba7" + "model_id": "8e4839cdcd2b45a5a06471bc2243817c" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 19 + "execution_count": 16 }, { "metadata": {}, @@ -301,16 +309,13 @@ "id": "c24f76eff2cd8537" }, { - "metadata": { - "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.584004Z", - "start_time": "2025-07-03T13:12:32.426510Z" - } - }, + "metadata": {}, "cell_type": "code", + "outputs": [], + "execution_count": null, "source": [ - "pyplot.plot(K2C(T_0_50), alpha_kinetic, 'g', label=\"with Si\")\n", - "pyplot.plot(K2C(T_0_50), eff_alpha_kinetic, 'g--', label=\"with effective Si\")\n", + "pyplot.plot(K2C(T_0_50), alpha_kinetic, 'k', label=\"with Si\")\n", + "pyplot.plot(K2C(T_0_50), eff_alpha_kinetic, 'k--', label=\"with effective Si\")\n", "pyplot.legend()\n", "pyplot.gca().set(\n", " title=\"Kinetic Fractionation Factors of Temperature\",\n", @@ -320,34 +325,7 @@ "pyplot.grid()\n", "show_plot('alpha_kinetic_of_temperature')" ], - "id": "15ec13a660cf954f", - "outputs": [ - { - "data": { - "text/plain": [ - "
" - ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.565524\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" - ], - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "a71b79fcdf3e4e39853ad8dbb0e67178" - } - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "execution_count": 20 + "id": "a6f43368e6074e34" }, { "metadata": {}, @@ -362,8 +340,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.605388Z", - "start_time": "2025-07-03T13:12:32.602097Z" + "end_time": "2025-07-06T20:04:16.545887Z", + "start_time": "2025-07-06T20:04:15.736925Z" } }, "cell_type": "code", @@ -384,13 +362,13 @@ ], "id": "1a7e5ae0c7093428", "outputs": [], - "execution_count": 21 + "execution_count": 18 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-03T13:12:32.781402Z", - "start_time": "2025-07-03T13:12:32.621724Z" + "end_time": "2025-07-06T20:07:07.248422Z", + "start_time": "2025-07-06T20:07:07.032942Z" } }, "cell_type": "code", @@ -399,8 +377,8 @@ " pyplot.plot(\n", " Si,\n", " alphas_eff[:, i],\n", - " label=f'{K2C(T):.5g} [°C]',\n", - " color='g',\n", + " 'g',\n", + " label=f'${K2C(T):.5g}$ [°C]',\n", " linewidth = 1 + i/2\n", " )\n", "pyplot.gca().set(\n", @@ -412,14 +390,14 @@ "pyplot.legend()\n", "show_plot('fig_9')" ], - "id": "8b1287b4696c7dda", + "id": "7c07f76691edf597", "outputs": [ { "data": { "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-03T15:12:32.763244\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-06T22:07:07.226692\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -432,14 +410,22 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "0501ac8ed30b49c49a0be9dbe35e4896" + "model_id": "aae7df482fc24947abeee8f5fde425fa" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 22 + "execution_count": 23 + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": "", + "id": "d482baa7f1c16462" } ], "metadata": { From 6efd7bf651d9eb94d600441a76965098a2ebfd7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 10 Jul 2025 12:57:03 +0200 Subject: [PATCH 22/26] update formula for transfer coeff to match J&M 1984 --- .../jouzel_and_merlivat_1984.py | 4 +- .../Jouzel_and_Merlivat_1984/fig_8_9.ipynb | 130 +++++++++++------- 2 files changed, 84 insertions(+), 50 deletions(-) diff --git a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py index 0e4ae30502..783388dc6a 100644 --- a/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py +++ b/PySDM/physics/isotope_kinetic_fractionation_factors/jouzel_and_merlivat_1984.py @@ -32,7 +32,7 @@ def alpha_kinetic(alpha_equilibrium, saturation, D_ratio_heavy_to_light): ) @staticmethod - def transfer_coefficient(D, Fk): + def transfer_coefficient(const, rho_s, D, Fk): """ eq. (A4) in Jouzel & Merlivat 1975, eq. (A6) in Bolot 2013. @@ -48,7 +48,7 @@ def transfer_coefficient(D, Fk): ---------- Thermal transfer coefficient between water vapour and condensate. """ - return 1 / (1 + D * Fk) + return 1 / (1 + D * rho_s / const.rho_w * Fk) @staticmethod def effective_saturation(transfer_coefficient, RH): diff --git a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb index a59c28a76d..e38ee8b6fb 100644 --- a/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb +++ b/examples/PySDM_examples/Jouzel_and_Merlivat_1984/fig_8_9.ipynb @@ -23,8 +23,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:14.905723Z", - "start_time": "2025-07-06T20:04:14.900796Z" + "end_time": "2025-07-10T10:48:11.678433Z", + "start_time": "2025-07-10T10:48:11.674981Z" } }, "cell_type": "code", @@ -37,7 +37,7 @@ ], "id": "466d06cabb3174f3", "outputs": [], - "execution_count": 9 + "execution_count": 1 }, { "cell_type": "code", @@ -45,8 +45,8 @@ "metadata": { "collapsed": true, "ExecuteTime": { - "end_time": "2025-07-06T20:04:14.925137Z", - "start_time": "2025-07-06T20:04:14.922741Z" + "end_time": "2025-07-10T10:48:13.278425Z", + "start_time": "2025-07-10T10:48:11.743948Z" } }, "source": [ @@ -58,13 +58,13 @@ "from open_atmos_jupyter_utils import show_plot" ], "outputs": [], - "execution_count": 10 + "execution_count": 2 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:14.947223Z", - "start_time": "2025-07-06T20:04:14.940365Z" + "end_time": "2025-07-10T10:48:13.549139Z", + "start_time": "2025-07-10T10:48:13.285324Z" } }, "cell_type": "code", @@ -89,13 +89,13 @@ ], "id": "6f7078d9d56a0a7c", "outputs": [], - "execution_count": 11 + "execution_count": 3 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:14.964248Z", - "start_time": "2025-07-06T20:04:14.957645Z" + "end_time": "2025-07-10T10:48:13.561668Z", + "start_time": "2025-07-10T10:48:13.559532Z" } }, "cell_type": "code", @@ -110,7 +110,7 @@ ], "id": "2c7e390144e7499", "outputs": [], - "execution_count": 12 + "execution_count": 4 }, { "metadata": {}, @@ -121,8 +121,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:14.974512Z", - "start_time": "2025-07-06T20:04:14.971371Z" + "end_time": "2025-07-10T10:48:15.236361Z", + "start_time": "2025-07-10T10:48:13.569626Z" } }, "cell_type": "code", @@ -136,14 +136,13 @@ " T=T_0_50,\n", " K=formulae.diffusion_thermics.K(T=T_0_50, p=pressure),\n", " lv=formulae.latent_heat_vapourisation.lv(T_0_50)\n", - ") / const.rho_w * pvs_ice(T_0_50) / const.Rv / T_0_50 # TODO change A definition or call it differently\n", - "\n", + ")\n", "\n", "saturation_wrt_ice_at_RH100 = pvs_water(T_0_50) / pvs_ice(T_0_50)\n", "\n", - "\n", "eff_saturation_wrt_ice_at_RH100 = formulae.isotope_kinetic_fractionation_factors.effective_saturation(\n", " transfer_coefficient=formulae.isotope_kinetic_fractionation_factors.transfer_coefficient(\n", + " rho_s = pvs_ice(T_0_50) / const.Rv / T_0_50,\n", " D=D_light,\n", " Fk=Fk\n", "),\n", @@ -152,13 +151,13 @@ ], "id": "47503ee93cc639b7", "outputs": [], - "execution_count": 13 + "execution_count": 5 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:14.984673Z", - "start_time": "2025-07-06T20:04:14.982519Z" + "end_time": "2025-07-10T10:48:16.174530Z", + "start_time": "2025-07-10T10:48:15.248702Z" } }, "cell_type": "code", @@ -178,13 +177,13 @@ ], "id": "ad049bb8d20fa39b", "outputs": [], - "execution_count": 14 + "execution_count": 6 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:09:04.656624Z", - "start_time": "2025-07-06T20:09:04.456285Z" + "end_time": "2025-07-10T10:48:16.674907Z", + "start_time": "2025-07-10T10:48:16.184371Z" } }, "cell_type": "code", @@ -232,7 +231,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-06T22:09:04.639827\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-10T12:48:16.658508\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -245,26 +244,26 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "cc95c25f87184e01a8cc0712442e21bd" + "model_id": "a1dfa4c3b72242c39e736397d22a942d" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 25 + "execution_count": 7 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:15.536558Z", - "start_time": "2025-07-06T20:04:15.173042Z" + "end_time": "2025-07-10T10:48:16.991147Z", + "start_time": "2025-07-10T10:48:16.706807Z" } }, "cell_type": "code", "source": [ "saturation_difference = saturation_wrt_ice_at_RH100 - eff_saturation_wrt_ice_at_RH100\n", - "pyplot.plot(K2C(T_0_50), abs(saturation_difference))\n", + "pyplot.plot(K2C(T_0_50), abs(saturation_difference), 'k')\n", "pyplot.grid()\n", "pyplot.gca().set(\n", " title=\"Absolute difference between environment and effective saturation wrt ice\",\n", @@ -280,7 +279,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-06T22:04:15.520933\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-10T12:48:16.975254\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -293,14 +292,14 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "8e4839cdcd2b45a5a06471bc2243817c" + "model_id": "383f4d6a91a64d058af9e8e32b46fb5d" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 16 + "execution_count": 8 }, { "metadata": {}, @@ -309,10 +308,13 @@ "id": "c24f76eff2cd8537" }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-10T10:48:17.154165Z", + "start_time": "2025-07-10T10:48:17.008329Z" + } + }, "cell_type": "code", - "outputs": [], - "execution_count": null, "source": [ "pyplot.plot(K2C(T_0_50), alpha_kinetic, 'k', label=\"with Si\")\n", "pyplot.plot(K2C(T_0_50), eff_alpha_kinetic, 'k--', label=\"with effective Si\")\n", @@ -325,7 +327,34 @@ "pyplot.grid()\n", "show_plot('alpha_kinetic_of_temperature')" ], - "id": "a6f43368e6074e34" + "id": "a6f43368e6074e34", + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ], + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-10T12:48:17.136976\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "HBox(children=(HTML(value=\"./alpha_kinetic_of_tem…" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "7e88c170759c47f68245fadf3f3ad6f5" + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 9 }, { "metadata": {}, @@ -340,8 +369,8 @@ { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:04:16.545887Z", - "start_time": "2025-07-06T20:04:15.736925Z" + "end_time": "2025-07-10T10:48:18.029386Z", + "start_time": "2025-07-10T10:48:17.159609Z" } }, "cell_type": "code", @@ -362,13 +391,13 @@ ], "id": "1a7e5ae0c7093428", "outputs": [], - "execution_count": 18 + "execution_count": 10 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-07-06T20:07:07.248422Z", - "start_time": "2025-07-06T20:07:07.032942Z" + "end_time": "2025-07-10T10:48:18.247014Z", + "start_time": "2025-07-10T10:48:18.054434Z" } }, "cell_type": "code", @@ -397,7 +426,7 @@ "text/plain": [ "
" ], - "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-06T22:07:07.226692\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" + "image/svg+xml": "\n\n\n \n \n \n \n 2025-07-10T12:48:18.226016\n image/svg+xml\n \n \n Matplotlib v3.10.0, 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" }, "metadata": {}, "output_type": "display_data" @@ -410,22 +439,27 @@ "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "aae7df482fc24947abeee8f5fde425fa" + "model_id": "df8d0f3528124da78a006fd0b6c88e9c" } }, "metadata": {}, "output_type": "display_data" } ], - "execution_count": 23 + "execution_count": 11 }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-10T10:48:18.272016Z", + "start_time": "2025-07-10T10:48:18.269850Z" + } + }, "cell_type": "code", - "outputs": [], - "execution_count": null, "source": "", - "id": "d482baa7f1c16462" + "id": "d482baa7f1c16462", + "outputs": [], + "execution_count": null } ], "metadata": { From dbe2f4b1feb96c7ab257ff5037d183cc4046824e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 10 Jul 2025 13:41:50 +0200 Subject: [PATCH 23/26] add test for effective saturation --- ...t_isotope_kinetic_fractionation_factors.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 0596c876fc..641e323ecb 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -4,6 +4,7 @@ import numpy as np import pytest +from _pytest import mark from matplotlib import pyplot from PySDM import Formulae @@ -183,3 +184,38 @@ def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon( # assert np.testing.assert_equal(n > 0.5, True) np.testing.assert_equal(n < 1, True) + + @staticmethod + def test_effective_saturation(): + # arrange + formulae = Formulae( + isotope_kinetic_fractionation_factors="JouzelAndMerlivat1984", + drop_growth="Mason1971", + ) + const = formulae.constants + saturation = np.linspace(0.8, 1.2) + T = 263.15 + rho_s = formulae.saturation_vapour_pressure.pvs_ice(T) / const.Rv / T + Fk = formulae.drop_growth.Fk( + T=T, + K=const.K0, + lv=formulae.latent_heat_vapourisation.lv(T), + ) + A_li = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient( + rho_s=rho_s, D=const.D0, Fk=Fk + ) + + # act + sut = formulae.isotope_kinetic_fractionation_factors.effective_saturation( + transfer_coefficient=A_li, + RH=saturation, + ) + idx_subsaturation = np.where(saturation < 1) + + # assert + np.testing.assert_array_less( + saturation[idx_subsaturation], sut[idx_subsaturation] + ) + np.testing.assert_array_less( + sut[~idx_subsaturation[0]], saturation[~idx_subsaturation[0]] + ) From 06beac75d66df447657522ae9d1a7150902371d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 10 Jul 2025 18:05:49 +0200 Subject: [PATCH 24/26] fix test after refactor --- .../test_isotope_kinetic_fractionation_factors.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 641e323ecb..4aabeb3b5d 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -4,7 +4,6 @@ import numpy as np import pytest -from _pytest import mark from matplotlib import pyplot from PySDM import Formulae @@ -39,11 +38,15 @@ def test_units_alpha_kinetic(): def test_units_transfer_coefficient(): with DimensionalAnalysis(): # arrange + const = Formulae().constants + rho_s = 1 * physics.si.g / physics.si.m**3 D = 1 * physics.si.m**2 / physics.si.s Fk = 1 * physics.si.s / physics.si.m**2 # act - sut = JouzelAndMerlivat1984.transfer_coefficient(D=D, Fk=Fk) + sut = JouzelAndMerlivat1984.transfer_coefficient( + const=const, D=D, Fk=Fk, rho_s=rho_s + ) # assert assert sut.check("[]") @@ -186,15 +189,15 @@ def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon( np.testing.assert_equal(n < 1, True) @staticmethod - def test_effective_saturation(): + @pytest.mark.parametrize("T", np.linspace(240, 300, 11)) + def test_effective_saturation(T): # arrange formulae = Formulae( isotope_kinetic_fractionation_factors="JouzelAndMerlivat1984", drop_growth="Mason1971", ) const = formulae.constants - saturation = np.linspace(0.8, 1.2) - T = 263.15 + saturation = np.linspace(0.8, 1.2, 21) rho_s = formulae.saturation_vapour_pressure.pvs_ice(T) / const.Rv / T Fk = formulae.drop_growth.Fk( T=T, From 8bf5a4938b3a7c248353a4bbf778aed2a593aa80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 10 Jul 2025 19:53:56 +0200 Subject: [PATCH 25/26] fix test after refactor vol2 --- .../smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py index af4a3679f8..1064a89c5f 100644 --- a/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py +++ b/tests/smoke_tests/no_env/jouzel_and_merlivat_1984/test_fig_8.py @@ -44,9 +44,9 @@ def test_fig8_values_against_the_paper( # arrange temperature_C = notebook_variables["T_0_50"] - T0 if if_effective: - Si = notebook_variables["eff_saturation_wrt_ice"] + Si = notebook_variables["eff_saturation_wrt_ice_at_RH100"] else: - Si = notebook_variables["saturation_wrt_ice"] + Si = notebook_variables["saturation_wrt_ice_at_RH100"] # act sut = Si[np.argmin(np.abs(temperature_C - temp_C))] From 7d555dfeec056e8dbfd41082fd0709c4c3bc0896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Agnieszka=20=C5=BBaba?= Date: Thu, 10 Jul 2025 20:32:46 +0200 Subject: [PATCH 26/26] use class in test instead Formulae --- .../test_isotope_kinetic_fractionation_factors.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py index 4aabeb3b5d..1a1855c362 100644 --- a/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py +++ b/tests/unit_tests/physics/test_isotope_kinetic_fractionation_factors.py @@ -192,10 +192,7 @@ def test_alpha_kinetic_jouzel_merlivat_vs_craig_gordon( @pytest.mark.parametrize("T", np.linspace(240, 300, 11)) def test_effective_saturation(T): # arrange - formulae = Formulae( - isotope_kinetic_fractionation_factors="JouzelAndMerlivat1984", - drop_growth="Mason1971", - ) + formulae = Formulae(drop_growth="Mason1971") const = formulae.constants saturation = np.linspace(0.8, 1.2, 21) rho_s = formulae.saturation_vapour_pressure.pvs_ice(T) / const.Rv / T @@ -204,12 +201,12 @@ def test_effective_saturation(T): K=const.K0, lv=formulae.latent_heat_vapourisation.lv(T), ) - A_li = formulae.isotope_kinetic_fractionation_factors.transfer_coefficient( - rho_s=rho_s, D=const.D0, Fk=Fk + A_li = JouzelAndMerlivat1984.transfer_coefficient( + const=const, rho_s=rho_s, D=const.D0, Fk=Fk ) # act - sut = formulae.isotope_kinetic_fractionation_factors.effective_saturation( + sut = JouzelAndMerlivat1984.effective_saturation( transfer_coefficient=A_li, RH=saturation, )