22CPU implementation of isotope-relates backend methods
33"""
44
5- from functools import cached_property
5+ from functools import cached_property , lru_cache
66
77import numba
88
@@ -76,9 +76,7 @@ def body(
7676 dm_heavy = dm_total [sd_id ] / Bo * mass_ratio_heavy_to_total
7777 dn_heavy_molecule = dm_heavy / molar_mass_heavy_molecule
7878 moles_heavy_molecule [sd_id ] += dn_heavy_molecule
79- mass_of_dry_air = (
80- dry_air_density [cell_id [sd_id ]] * cell_volume [cell_id [sd_id ]]
81- )
79+ mass_of_dry_air = dry_air_density [cell_id [sd_id ]] * cell_volume
8280 molality_in_dry_air [cell_id [sd_id ]] -= (
8381 dn_heavy_molecule * multiplicity [sd_id ] / mass_of_dry_air
8482 )
@@ -102,7 +100,7 @@ def isotopic_fractionation(
102100 """Update heavy-isotope composition during droplet growth/evaporation."""
103101 self ._isotopic_fractionation_body (
104102 cell_id = cell_id .data ,
105- cell_volume = cell_volume . data ,
103+ cell_volume = cell_volume ,
106104 multiplicity = multiplicity .data ,
107105 dm_total = dm_total .data ,
108106 signed_water_mass = signed_water_mass .data ,
@@ -133,6 +131,8 @@ def body(
133131 * ,
134132 output ,
135133 cell_id ,
134+ alpha ,
135+ D_ratio ,
136136 relative_humidity ,
137137 temperature ,
138138 density_dry_air ,
@@ -148,38 +148,51 @@ def body(
148148 conc_vap_total = (
149149 pvs_water * relative_humidity [cell_id [i ]] / ff .constants .R_str / T
150150 )
151- rho_v = pvs_water / T / ff .constants .Rv
152-
153151 isotopic_fraction = ff .trivia__isotopic_fraction (
154152 molality_in_dry_air = molality_in_dry_air [cell_id [i ]],
155153 density_dry_air = density_dry_air [cell_id [i ]],
156154 total_vap_concentration = conc_vap_total ,
157155 )
158- D_ratio_heavy_to_light = (
159- ff .isotope_diffusivity_ratios__ratio_2H_heavy_to_light (T )
160- )
161156 output [i ] = ff .isotope_relaxation_timescale__bolin_number (
162- D_ratio_heavy_to_light = D_ratio_heavy_to_light ,
163- alpha = ff .isotope_equilibrium_fractionation_factors__alpha_l_2H (T ),
164- D_light = ff .constants .D0 ,
157+ D_ratio_heavy_to_light = D_ratio (T ),
158+ alpha = alpha (T ),
165159 Fk = ff .drop_growth__Fk (
166160 T = T , K = ff .constants .K0 , lv = ff .constants .l_tri
167161 ),
162+ Fd = ff .drop_growth__Fd (
163+ T = T ,
164+ D = ff .constants .D0 ,
165+ pvs = pvs_water ,
166+ ),
168167 R_vap = ff .trivia__isotopic_ratio_assuming_single_heavy_isotope (
169168 isotopic_fraction
170169 ),
171170 R_liq = moles_heavy_atom / moles_light_isotope ,
172171 relative_humidity = relative_humidity [cell_id [i ]],
173- rho_v = rho_v ,
174172 )
175173
176174 return body
177175
176+ @lru_cache
177+ def alpha_l (self , isotope ):
178+ return getattr (
179+ self .formulae_flattened ,
180+ f"isotope_equilibrium_fractionation_factors__alpha_l_{ isotope } " ,
181+ )
182+
183+ @lru_cache
184+ def D_ratio (self , isotope ):
185+ return getattr (
186+ self .formulae_flattened ,
187+ f"isotope_diffusivity_ratios__ratio_{ isotope } _heavy_to_light" ,
188+ )
189+
178190 def bolin_number (
179191 self ,
180192 * ,
181193 output ,
182194 cell_id ,
195+ isotope ,
183196 relative_humidity ,
184197 temperature ,
185198 density_dry_air ,
@@ -191,6 +204,8 @@ def bolin_number(
191204 self ._bolin_number_body (
192205 output = output .data ,
193206 cell_id = cell_id .data ,
207+ D_ratio = self .D_ratio (isotope ),
208+ alpha = self .alpha_l (isotope ),
194209 relative_humidity = relative_humidity .data ,
195210 temperature = temperature .data ,
196211 density_dry_air = density_dry_air .data ,
0 commit comments