pycontrails 0.54.6__cp312-cp312-win_amd64.whl → 0.54.7__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pycontrails might be problematic. Click here for more details.
- pycontrails/__init__.py +1 -1
- pycontrails/_version.py +2 -2
- pycontrails/core/aircraft_performance.py +12 -30
- pycontrails/core/airports.py +4 -1
- pycontrails/core/flight.py +4 -4
- pycontrails/core/met.py +41 -33
- pycontrails/core/met_var.py +18 -0
- pycontrails/core/models.py +79 -3
- pycontrails/core/rgi_cython.cp312-win_amd64.pyd +0 -0
- pycontrails/core/vector.py +66 -0
- pycontrails/datalib/spire/__init__.py +5 -0
- pycontrails/datalib/spire/exceptions.py +62 -0
- pycontrails/datalib/spire/spire.py +606 -0
- pycontrails/models/accf.py +4 -4
- pycontrails/models/cocip/cocip.py +38 -1
- pycontrails/models/cocip/cocip_params.py +10 -1
- pycontrails/models/cocip/unterstrasser_wake_vortex.py +132 -30
- pycontrails/models/cocipgrid/cocip_grid.py +3 -0
- pycontrails/models/emissions/black_carbon.py +19 -14
- pycontrails/models/emissions/emissions.py +8 -8
- pycontrails/models/ps_model/ps_model.py +1 -1
- pycontrails/physics/constants.py +2 -1
- {pycontrails-0.54.6.dist-info → pycontrails-0.54.7.dist-info}/METADATA +3 -3
- {pycontrails-0.54.6.dist-info → pycontrails-0.54.7.dist-info}/NOTICE +1 -1
- {pycontrails-0.54.6.dist-info → pycontrails-0.54.7.dist-info}/RECORD +28 -26
- pycontrails/datalib/spire.py +0 -739
- {pycontrails-0.54.6.dist-info → pycontrails-0.54.7.dist-info}/LICENSE +0 -0
- {pycontrails-0.54.6.dist-info → pycontrails-0.54.7.dist-info}/WHEEL +0 -0
- {pycontrails-0.54.6.dist-info → pycontrails-0.54.7.dist-info}/top_level.txt +0 -0
|
@@ -103,6 +103,8 @@ class CocipParams(AdvectionBuffers):
|
|
|
103
103
|
#: Cocip output with ``preprocess_lowmem=True`` is only guaranteed to match output
|
|
104
104
|
#: with ``preprocess_lowmem=False`` when run with ``interpolation_bounds_error=True``
|
|
105
105
|
#: to ensure no out-of-bounds interpolation occurs.
|
|
106
|
+
#:
|
|
107
|
+
#: .. versionadded:: 0.52.3
|
|
106
108
|
preprocess_lowmem: bool = False
|
|
107
109
|
|
|
108
110
|
# --------------
|
|
@@ -114,6 +116,8 @@ class CocipParams(AdvectionBuffers):
|
|
|
114
116
|
#: ``"auto"``, ``"tau_cirrus"`` will be computed during model initialization
|
|
115
117
|
#: iff the met data is dask-backed. Otherwise, it will be computed during model
|
|
116
118
|
#: evaluation after the met data is downselected.
|
|
119
|
+
#:
|
|
120
|
+
#: .. versionadded:: 0.47.1
|
|
117
121
|
compute_tau_cirrus_in_model_init: bool | str = "auto"
|
|
118
122
|
|
|
119
123
|
# ---------
|
|
@@ -152,10 +156,14 @@ class CocipParams(AdvectionBuffers):
|
|
|
152
156
|
#: These are not standard CoCiP outputs but based on the derivation used
|
|
153
157
|
#: in the first supplement to :cite:`yinPredictingClimateImpact2023`. ATR20 is defined
|
|
154
158
|
#: as the average temperature response over a 20 year horizon.
|
|
159
|
+
#:
|
|
160
|
+
#: .. versionadded:: 0.50.0
|
|
155
161
|
compute_atr20: bool = False
|
|
156
162
|
|
|
157
163
|
#: Constant factor used to convert global- and year-mean RF, [:math:`W m^{-2}`],
|
|
158
164
|
#: to ATR20, [:math:`K`], given by :cite:`yinPredictingClimateImpact2023`.
|
|
165
|
+
#:
|
|
166
|
+
#: .. versionadded:: 0.50.0
|
|
159
167
|
global_rf_to_atr20_factor: float = 0.0151
|
|
160
168
|
|
|
161
169
|
# ----------------
|
|
@@ -197,12 +205,13 @@ class CocipParams(AdvectionBuffers):
|
|
|
197
205
|
max_depth: float = 1500.0
|
|
198
206
|
|
|
199
207
|
#: Experimental. Improved ice crystal number survival fraction in the wake vortex phase.
|
|
200
|
-
#: Implement :cite:`
|
|
208
|
+
#: Implement :cite:`lottermoserHighResolutionEarlyContrails2025`, who developed a
|
|
201
209
|
#: parametric model that estimates the survival fraction of the contrail ice crystal
|
|
202
210
|
#: number after the wake vortex phase based on the results from large eddy simulations.
|
|
203
211
|
#: This replicates Fig. 4 of :cite:`karcherFormationRadiativeForcing2018`.
|
|
204
212
|
#:
|
|
205
213
|
#: .. versionadded:: 0.50.1
|
|
214
|
+
#: .. versionchanged:: 0.54.7
|
|
206
215
|
unterstrasser_ice_survival_fraction: bool = False
|
|
207
216
|
|
|
208
217
|
#: Experimental. Radiative heating effects on contrail cirrus properties.
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
"""Wave-vortex downwash functions from Unterstrasser (
|
|
1
|
+
"""Wave-vortex downwash functions from Lottermoser & Unterstrasser (2025).
|
|
2
2
|
|
|
3
3
|
Notes
|
|
4
4
|
-----
|
|
5
5
|
:cite:`unterstrasserPropertiesYoungContrails2016` provides a parameterized model of the
|
|
6
6
|
survival fraction of the contrail ice crystal number ``f_surv`` during the wake-vortex phase.
|
|
7
|
-
The model
|
|
8
|
-
|
|
7
|
+
The model has since been updated in :cite:`lottermoserHighResolutionEarlyContrails2025`. This update
|
|
8
|
+
improves the goodness-of-fit between the parameterised model and LES, and expands the parameter
|
|
9
|
+
space and can now be used for very low and very high soot inputs, different fuel types (where the
|
|
10
|
+
EI H2Os are different), and higher ambient temperatures (up to 235 K) to accomodate for contrails
|
|
11
|
+
formed by liquid hydrogen aircraft. The model was developed based on output from large eddy
|
|
12
|
+
simulations, and improves agreement with LES outputs relative to the default survival fraction
|
|
13
|
+
parameterization used in CoCiP.
|
|
9
14
|
|
|
10
15
|
For comparison, CoCiP assumes that ``f_surv`` is equal to the change in the contrail ice water
|
|
11
16
|
content (by mass) before and after the wake vortex phase. However, for larger (smaller) ice
|
|
@@ -14,6 +19,9 @@ by mass. This is particularly important in the "soot-poor" scenario, for example
|
|
|
14
19
|
lean-burn engines where their soot emissions can be 3-4 orders of magnitude lower than conventional
|
|
15
20
|
RQL engines.
|
|
16
21
|
|
|
22
|
+
ADD CITATION TO BIBTEX: :cite:`lottermoserHighResolutionEarlyContrails2025`
|
|
23
|
+
Lottermoser, A. and Unterstraßer, S.: High-resolution modelling of early contrail evolution from
|
|
24
|
+
hydrogen-powered aircraft, EGUsphere [preprint], https://doi.org/10.5194/egusphere-2024-3859, 2025.
|
|
17
25
|
"""
|
|
18
26
|
|
|
19
27
|
from __future__ import annotations
|
|
@@ -34,6 +42,8 @@ def ice_particle_number_survival_fraction(
|
|
|
34
42
|
fuel_flow: npt.NDArray[np.floating],
|
|
35
43
|
aei_n: npt.NDArray[np.floating],
|
|
36
44
|
z_desc: npt.NDArray[np.floating],
|
|
45
|
+
*,
|
|
46
|
+
analytical_solution: bool = True,
|
|
37
47
|
) -> npt.NDArray[np.floating]:
|
|
38
48
|
r"""
|
|
39
49
|
Calculate fraction of ice particle number surviving the wake vortex phase and required inputs.
|
|
@@ -61,6 +71,8 @@ def ice_particle_number_survival_fraction(
|
|
|
61
71
|
z_desc : npt.NDArray[np.floating]
|
|
62
72
|
Final vertical displacement of the wake vortex, ``dz_max`` in :mod:`wake_vortex.py`,
|
|
63
73
|
[:math:`m`].
|
|
74
|
+
analytical_solution : bool
|
|
75
|
+
Use analytical solution to calculate ``z_atm`` and ``z_emit`` instead of numerical solution.
|
|
64
76
|
|
|
65
77
|
Returns
|
|
66
78
|
-------
|
|
@@ -70,57 +82,114 @@ def ice_particle_number_survival_fraction(
|
|
|
70
82
|
References
|
|
71
83
|
----------
|
|
72
84
|
- :cite:`unterstrasserPropertiesYoungContrails2016`
|
|
85
|
+
- :cite:`lottermoserHighResolutionEarlyContrails2025`
|
|
73
86
|
|
|
74
87
|
Notes
|
|
75
88
|
-----
|
|
76
|
-
- See eq. (3), (9), and (10) in :cite:`unterstrasserPropertiesYoungContrails2016`.
|
|
77
89
|
- For consistency in CoCiP, ``z_desc`` should be calculated using :func:`dz_max` instead of
|
|
78
90
|
using :func:`z_desc_length_scale`.
|
|
79
91
|
"""
|
|
80
|
-
# Length scales
|
|
81
|
-
z_atm = z_atm_length_scale(air_temperature, rhi_0)
|
|
82
92
|
rho_emit = emitted_water_vapour_concentration(ei_h2o, wingspan, true_airspeed, fuel_flow)
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
|
|
94
|
+
# Length scales
|
|
95
|
+
if analytical_solution:
|
|
96
|
+
z_atm = z_atm_length_scale_analytical(air_temperature, rhi_0)
|
|
97
|
+
z_emit = z_emit_length_scale_analytical(rho_emit, air_temperature)
|
|
98
|
+
|
|
99
|
+
else:
|
|
100
|
+
z_atm = z_atm_length_scale_numerical(air_temperature, rhi_0)
|
|
101
|
+
z_emit = z_emit_length_scale_numerical(rho_emit, air_temperature)
|
|
102
|
+
|
|
103
|
+
z_total = z_total_length_scale(z_atm, z_emit, z_desc, true_airspeed, fuel_flow, aei_n, wingspan)
|
|
85
104
|
return _survival_fraction_from_length_scale(z_total)
|
|
86
105
|
|
|
87
106
|
|
|
88
107
|
def z_total_length_scale(
|
|
89
|
-
aei_n: npt.NDArray[np.floating],
|
|
90
108
|
z_atm: npt.NDArray[np.floating],
|
|
91
109
|
z_emit: npt.NDArray[np.floating],
|
|
92
110
|
z_desc: npt.NDArray[np.floating],
|
|
111
|
+
true_airspeed: npt.NDArray[np.floating],
|
|
112
|
+
fuel_flow: npt.NDArray[np.floating],
|
|
113
|
+
aei_n: npt.NDArray[np.floating],
|
|
114
|
+
wingspan: npt.NDArray[np.floating] | float,
|
|
93
115
|
) -> npt.NDArray[np.floating]:
|
|
94
116
|
"""
|
|
95
117
|
Calculate the total length-scale effect of the wake vortex downwash.
|
|
96
118
|
|
|
97
119
|
Parameters
|
|
98
120
|
----------
|
|
99
|
-
aei_n : npt.NDArray[np.floating]
|
|
100
|
-
Apparent ice crystal number emissions index at contrail formation, [:math:`kg^{-1}`]
|
|
101
121
|
z_atm : npt.NDArray[np.floating]
|
|
102
122
|
Length-scale effect of ambient supersaturation on the ice crystal mass budget, [:math:`m`]
|
|
103
123
|
z_emit : npt.NDArray[np.floating]
|
|
104
124
|
Length-scale effect of water vapour emissions on the ice crystal mass budget, [:math:`m`]
|
|
105
125
|
z_desc : npt.NDArray[np.floating]
|
|
106
126
|
Final vertical displacement of the wake vortex, `dz_max` in `wake_vortex.py`, [:math:`m`]
|
|
127
|
+
true_airspeed : npt.NDArray[np.floating]
|
|
128
|
+
true airspeed for each waypoint, [:math:`m s^{-1}`]
|
|
129
|
+
fuel_flow : npt.NDArray[np.floating]
|
|
130
|
+
Fuel mass flow rate, [:math:`kg s^{-1}`]
|
|
131
|
+
aei_n : npt.NDArray[np.floating]
|
|
132
|
+
Apparent ice crystal number emissions index at contrail formation, [:math:`kg^{-1}`]
|
|
133
|
+
wingspan : npt.NDArray[np.floating] | float
|
|
134
|
+
aircraft wingspan, [:math:`m`]
|
|
107
135
|
|
|
108
136
|
Returns
|
|
109
137
|
-------
|
|
110
138
|
npt.NDArray[np.floating]
|
|
111
139
|
Total length-scale effect of the wake vortex downwash, [:math:`m`]
|
|
140
|
+
|
|
141
|
+
Notes
|
|
142
|
+
-----
|
|
143
|
+
- For `psi`, see Appendix A1 in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
144
|
+
- For `z_total`, see Eq. (9) and (10) in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
145
|
+
"""
|
|
146
|
+
# Calculate psi term
|
|
147
|
+
fuel_dist = fuel_flow / true_airspeed # Units: [:math:`kg m^{-1}`]
|
|
148
|
+
n_ice_dist = fuel_dist * aei_n # Units: [:math:`m^{-1}`]
|
|
149
|
+
|
|
150
|
+
n_ice_per_vol = n_ice_dist / plume_area(wingspan) # Units: [:math:`m^{-3}`]
|
|
151
|
+
n_ice_per_vol_ref = 3.38e12 / plume_area(60.3)
|
|
152
|
+
|
|
153
|
+
psi = (n_ice_per_vol_ref / n_ice_per_vol) ** 0.16
|
|
154
|
+
|
|
155
|
+
# Calculate total length-scale effect
|
|
156
|
+
return psi * (1.27 * z_atm + 0.42 * z_emit) - 0.49 * z_desc
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def z_atm_length_scale_analytical(
|
|
160
|
+
air_temperature: npt.NDArray[np.floating],
|
|
161
|
+
rhi_0: npt.NDArray[np.floating],
|
|
162
|
+
) -> npt.NDArray[np.floating]:
|
|
163
|
+
"""Calculate the length-scale effect of ambient supersaturation on the ice crystal mass budget.
|
|
164
|
+
|
|
165
|
+
Parameters
|
|
166
|
+
----------
|
|
167
|
+
air_temperature : npt.NDArray[np.floating]
|
|
168
|
+
Ambient temperature for each waypoint, [:math:`K`].
|
|
169
|
+
rhi_0 : npt.NDArray[np.floating]
|
|
170
|
+
Relative humidity with respect to ice at the flight waypoint.
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
npt.NDArray[np.floating]
|
|
175
|
+
The effect of the ambient supersaturation on the ice crystal mass budget,
|
|
176
|
+
provided as a length scale equivalent, estimated with analytical fit [:math:`m`].
|
|
177
|
+
|
|
178
|
+
Notes
|
|
179
|
+
-----
|
|
180
|
+
- See Eq. (A2) in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
112
181
|
"""
|
|
113
|
-
|
|
114
|
-
alpha_atm = 1.7 * alpha_base
|
|
115
|
-
alpha_emit = 1.15 * alpha_base
|
|
182
|
+
z_atm = np.zeros_like(rhi_0)
|
|
116
183
|
|
|
117
|
-
|
|
184
|
+
# Only perform operation when the ambient condition is supersaturated w.r.t. ice
|
|
185
|
+
issr = rhi_0 > 1.0
|
|
118
186
|
|
|
119
|
-
|
|
120
|
-
|
|
187
|
+
s_i = rhi_0 - 1.0
|
|
188
|
+
z_atm[issr] = 607.46 * s_i[issr] ** 0.897 * (air_temperature[issr] / 205.0) ** 2.225
|
|
189
|
+
return z_atm
|
|
121
190
|
|
|
122
191
|
|
|
123
|
-
def
|
|
192
|
+
def z_atm_length_scale_numerical(
|
|
124
193
|
air_temperature: npt.NDArray[np.floating],
|
|
125
194
|
rhi_0: npt.NDArray[np.floating],
|
|
126
195
|
*,
|
|
@@ -141,11 +210,11 @@ def z_atm_length_scale(
|
|
|
141
210
|
-------
|
|
142
211
|
npt.NDArray[np.floating]
|
|
143
212
|
The effect of the ambient supersaturation on the ice crystal mass budget,
|
|
144
|
-
provided as a length scale equivalent, [:math:`m`].
|
|
213
|
+
provided as a length scale equivalent, estimated with numerical methods [:math:`m`].
|
|
145
214
|
|
|
146
215
|
Notes
|
|
147
216
|
-----
|
|
148
|
-
- See
|
|
217
|
+
- See Eq. (6) in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
149
218
|
"""
|
|
150
219
|
# Only perform operation when the ambient condition is supersaturated w.r.t. ice
|
|
151
220
|
issr = rhi_0 > 1.0
|
|
@@ -157,14 +226,14 @@ def z_atm_length_scale(
|
|
|
157
226
|
# Did not use scipy functions because it is unstable when dealing with np.arrays
|
|
158
227
|
z_1 = np.zeros_like(rhi_issr)
|
|
159
228
|
z_2 = np.full_like(rhi_issr, 1000.0)
|
|
160
|
-
lhs = rhi_issr * thermo.e_sat_ice(air_temperature_issr) / air_temperature_issr
|
|
229
|
+
lhs = rhi_issr * thermo.e_sat_ice(air_temperature_issr) / (air_temperature_issr**3.5)
|
|
161
230
|
|
|
162
231
|
dry_adiabatic_lapse_rate = constants.g / constants.c_pd
|
|
163
232
|
for _ in range(n_iter):
|
|
164
233
|
z_est = 0.5 * (z_1 + z_2)
|
|
165
234
|
rhs = (thermo.e_sat_ice(air_temperature_issr + dry_adiabatic_lapse_rate * z_est)) / (
|
|
166
235
|
air_temperature_issr + dry_adiabatic_lapse_rate * z_est
|
|
167
|
-
)
|
|
236
|
+
) ** 3.5
|
|
168
237
|
z_1[lhs > rhs] = z_est[lhs > rhs]
|
|
169
238
|
z_2[lhs < rhs] = z_est[lhs < rhs]
|
|
170
239
|
|
|
@@ -207,7 +276,38 @@ def emitted_water_vapour_concentration(
|
|
|
207
276
|
return h2o_per_dist / area_p
|
|
208
277
|
|
|
209
278
|
|
|
210
|
-
def
|
|
279
|
+
def z_emit_length_scale_analytical(
|
|
280
|
+
rho_emit: npt.NDArray[np.floating],
|
|
281
|
+
air_temperature: npt.NDArray[np.floating],
|
|
282
|
+
) -> npt.NDArray[np.floating]:
|
|
283
|
+
"""Calculate the length-scale effect of water vapour emissions on the ice crystal mass budget.
|
|
284
|
+
|
|
285
|
+
Parameters
|
|
286
|
+
----------
|
|
287
|
+
rho_emit : npt.NDArray[np.floating] | float
|
|
288
|
+
Aircraft-emitted water vapour concentration in the plume, [:math:`kg m^{-3}`]
|
|
289
|
+
air_temperature : npt.NDArray[np.floating]
|
|
290
|
+
ambient temperature for each waypoint, [:math:`K`]
|
|
291
|
+
|
|
292
|
+
Returns
|
|
293
|
+
-------
|
|
294
|
+
npt.NDArray[np.floating]
|
|
295
|
+
The effect of the aircraft water vapour emission on the ice crystal mass budget,
|
|
296
|
+
provided as a length scale equivalent, estimated with analytical fit [:math:`m`]
|
|
297
|
+
|
|
298
|
+
Notes
|
|
299
|
+
-----
|
|
300
|
+
- See Eq. (A3) in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
301
|
+
"""
|
|
302
|
+
t_205 = air_temperature - 205.0
|
|
303
|
+
return (
|
|
304
|
+
1106.6
|
|
305
|
+
* ((rho_emit * 1e5) ** (0.678 + 0.0116 * t_205))
|
|
306
|
+
* np.exp(-(0.0807 + 0.000428 * t_205) * t_205)
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def z_emit_length_scale_numerical(
|
|
211
311
|
rho_emit: npt.NDArray[np.floating],
|
|
212
312
|
air_temperature: npt.NDArray[np.floating],
|
|
213
313
|
*,
|
|
@@ -228,24 +328,26 @@ def z_emit_length_scale(
|
|
|
228
328
|
-------
|
|
229
329
|
npt.NDArray[np.floating]
|
|
230
330
|
The effect of the aircraft water vapour emission on the ice crystal mass budget,
|
|
231
|
-
provided as a length scale equivalent, [:math:`m`]
|
|
331
|
+
provided as a length scale equivalent, estimated with numerical methods [:math:`m`]
|
|
232
332
|
|
|
233
333
|
Notes
|
|
234
334
|
-----
|
|
235
|
-
- See
|
|
335
|
+
- See Eq. (7) in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
236
336
|
"""
|
|
237
337
|
# Solve non-linear equation numerically using the bisection method
|
|
238
338
|
# Did not use scipy functions because it is unstable when dealing with np.arrays
|
|
239
339
|
z_1 = np.zeros_like(rho_emit)
|
|
240
340
|
z_2 = np.full_like(rho_emit, 1000.0)
|
|
241
341
|
|
|
242
|
-
lhs = (thermo.e_sat_ice(air_temperature) / (constants.R_v * air_temperature)) +
|
|
342
|
+
lhs = (thermo.e_sat_ice(air_temperature) / (constants.R_v * air_temperature**3.5)) + (
|
|
343
|
+
rho_emit / (air_temperature**2.5)
|
|
344
|
+
)
|
|
243
345
|
|
|
244
346
|
dry_adiabatic_lapse_rate = constants.g / constants.c_pd
|
|
245
347
|
for _ in range(n_iter):
|
|
246
348
|
z_est = 0.5 * (z_1 + z_2)
|
|
247
349
|
rhs = thermo.e_sat_ice(air_temperature + dry_adiabatic_lapse_rate * z_est) / (
|
|
248
|
-
constants.R_v * (air_temperature + dry_adiabatic_lapse_rate * z_est)
|
|
350
|
+
constants.R_v * (air_temperature + dry_adiabatic_lapse_rate * z_est) ** 3.5
|
|
249
351
|
)
|
|
250
352
|
z_1[lhs > rhs] = z_est[lhs > rhs]
|
|
251
353
|
z_2[lhs < rhs] = z_est[lhs < rhs]
|
|
@@ -268,10 +370,10 @@ def plume_area(wingspan: npt.NDArray[np.floating] | float) -> npt.NDArray[np.flo
|
|
|
268
370
|
|
|
269
371
|
Notes
|
|
270
372
|
-----
|
|
271
|
-
- See eq. (A6) and (A7) in :cite:`
|
|
373
|
+
- See Appendix A2 in eq. (A6) and (A7) in :cite:`lottermoserHighResolutionEarlyContrails2025`.
|
|
272
374
|
"""
|
|
273
375
|
r_plume = 1.5 + 0.314 * wingspan
|
|
274
|
-
return 2.0 *
|
|
376
|
+
return 2.0 * np.pi * r_plume**2
|
|
275
377
|
|
|
276
378
|
|
|
277
379
|
def z_desc_length_scale(
|
|
@@ -368,7 +470,7 @@ def _survival_fraction_from_length_scale(
|
|
|
368
470
|
npt.NDArray[np.floating]
|
|
369
471
|
Fraction of ice particle number surviving the wake vortex phase
|
|
370
472
|
"""
|
|
371
|
-
f_surv = 0.
|
|
473
|
+
f_surv = 0.42 + (1.31 / np.pi) * np.arctan(-1.00 + (z_total / 100.0))
|
|
372
474
|
np.clip(f_surv, 0.0, 1.0, out=f_surv)
|
|
373
475
|
return f_surv
|
|
374
476
|
|
|
@@ -88,6 +88,9 @@ class CocipGrid(models.Model):
|
|
|
88
88
|
met_variables = cocip.Cocip.met_variables
|
|
89
89
|
rad_variables = cocip.Cocip.rad_variables
|
|
90
90
|
processed_met_variables = cocip.Cocip.processed_met_variables
|
|
91
|
+
generic_rad_variables = cocip.Cocip.generic_rad_variables
|
|
92
|
+
ecmwf_rad_variables = cocip.Cocip.ecmwf_rad_variables
|
|
93
|
+
gfs_rad_variables = cocip.Cocip.gfs_rad_variables
|
|
91
94
|
|
|
92
95
|
#: Met data is not optional
|
|
93
96
|
met: MetDataset
|
|
@@ -98,7 +98,7 @@ def flame_temperature(t_3: ArrayScalarLike) -> ArrayScalarLike:
|
|
|
98
98
|
ArrayScalarLike
|
|
99
99
|
Flame temperature at the combustion chamber, [:math:`K`]
|
|
100
100
|
"""
|
|
101
|
-
return 0.9 * t_3 + 2120
|
|
101
|
+
return 0.9 * t_3 + 2120.0
|
|
102
102
|
|
|
103
103
|
|
|
104
104
|
def bc_mass_concentration_fox(
|
|
@@ -125,7 +125,11 @@ def bc_mass_concentration_fox(
|
|
|
125
125
|
npt.NDArray[np.floating]:
|
|
126
126
|
Black carbon mass concentration for ground conditions, [:math:`mg m^{-3}`]
|
|
127
127
|
"""
|
|
128
|
-
|
|
128
|
+
# avoid float32 -> float64 promotion
|
|
129
|
+
coeff = 356.0 * np.exp(np.float32(-6390.0) / t_fl) - 608.0 * afr * np.exp(
|
|
130
|
+
np.float32(-19778.0) / t_fl
|
|
131
|
+
)
|
|
132
|
+
return fuel_flow * coeff
|
|
129
133
|
|
|
130
134
|
|
|
131
135
|
def bc_mass_concentration_cruise_fox(
|
|
@@ -209,7 +213,7 @@ def dopelheuer_lecht_scaling_factor(
|
|
|
209
213
|
----------
|
|
210
214
|
- :cite:`dopelheuerInfluenceEnginePerformance1998`
|
|
211
215
|
"""
|
|
212
|
-
exp_term = np.exp(20000 / t_fl_cru
|
|
216
|
+
exp_term = np.exp(20000.0 / t_fl_cru - 20000.0 / t_fl_ref)
|
|
213
217
|
return (afr_ref / afr_cru) ** 2.5 * (p_3_cru / p_3_ref) ** 1.35 * exp_term
|
|
214
218
|
|
|
215
219
|
|
|
@@ -295,7 +299,7 @@ def turbine_inlet_temperature_imfox(afr: npt.NDArray[np.floating]) -> npt.NDArra
|
|
|
295
299
|
----------
|
|
296
300
|
- :cite:`abrahamsonPredictiveModelDevelopment2016`
|
|
297
301
|
"""
|
|
298
|
-
return 490 + 42266 / afr
|
|
302
|
+
return 490.0 + 42266.0 / afr
|
|
299
303
|
|
|
300
304
|
|
|
301
305
|
def bc_mass_concentration_imfox(
|
|
@@ -325,9 +329,10 @@ def bc_mass_concentration_imfox(
|
|
|
325
329
|
npt.NDArray[np.floating]
|
|
326
330
|
Black carbon mass concentration, [:math:`mg m^{-3}`]
|
|
327
331
|
"""
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
332
|
+
# avoid float32 -> float64 promotion
|
|
333
|
+
exp_term = np.exp(np.float32(13.6) - fuel_hydrogen)
|
|
334
|
+
formation_term = 295.0 * np.exp(np.float32(-6390.0) / t_4)
|
|
335
|
+
oxidation_term = 608.0 * afr * np.exp(np.float32(-19778.0) / t_4)
|
|
331
336
|
return fuel_flow_per_engine * exp_term * (formation_term - oxidation_term)
|
|
332
337
|
|
|
333
338
|
|
|
@@ -453,11 +458,11 @@ def number_emissions_index_fractal_aggregates(
|
|
|
453
458
|
nvpm_ei_m: npt.NDArray[np.floating],
|
|
454
459
|
gmd: npt.NDArray[np.floating],
|
|
455
460
|
*,
|
|
456
|
-
gsd: float | npt.NDArray[np.floating] = 1.80,
|
|
457
|
-
rho_bc: float = 1770,
|
|
458
|
-
k_tem: float = 1.621e-5,
|
|
459
|
-
d_tem: float = 0.39,
|
|
460
|
-
d_fm: float = 2.76,
|
|
461
|
+
gsd: float | np.floating | npt.NDArray[np.floating] = np.float32(1.80), # avoid promotion
|
|
462
|
+
rho_bc: float | np.floating = np.float32(1770.0),
|
|
463
|
+
k_tem: float | np.floating = np.float32(1.621e-5),
|
|
464
|
+
d_tem: float | np.floating = np.float32(0.39),
|
|
465
|
+
d_fm: float | np.floating = np.float32(2.76),
|
|
461
466
|
) -> npt.NDArray[np.floating]:
|
|
462
467
|
"""
|
|
463
468
|
Estimate the black carbon number emission index using the fractal aggregates (FA) model.
|
|
@@ -494,9 +499,9 @@ def number_emissions_index_fractal_aggregates(
|
|
|
494
499
|
- ``rho_bc``: :cite:`parkMeasurementInherentMaterial2004`
|
|
495
500
|
- ``k_tem``, ``d_tem``: :cite:`dastanpourObservationsCorrelationPrimary2014`
|
|
496
501
|
"""
|
|
497
|
-
phi = 3 * d_tem + (1 - d_tem) * d_fm
|
|
502
|
+
phi = 3.0 * d_tem + (1.0 - d_tem) * d_fm
|
|
498
503
|
exponential_term = np.exp(0.5 * phi**2 * np.log(gsd) ** 2)
|
|
499
|
-
denom = rho_bc * (np.pi / 6) * k_tem ** (3 - d_fm) * gmd**phi * exponential_term
|
|
504
|
+
denom = rho_bc * (np.pi / 6.0) * k_tem ** (3.0 - d_fm) * gmd**phi * exponential_term
|
|
500
505
|
return nvpm_ei_m / denom
|
|
501
506
|
|
|
502
507
|
|
|
@@ -169,7 +169,7 @@ class Emissions(Model):
|
|
|
169
169
|
)
|
|
170
170
|
|
|
171
171
|
if "n_engine" not in self.source.attrs:
|
|
172
|
-
aircraft_type = self.source.
|
|
172
|
+
aircraft_type = self.source.get_constant("aircraft_type", None)
|
|
173
173
|
self.source.attrs["n_engine"] = self.default_engines.at[aircraft_type, "n_engine"]
|
|
174
174
|
|
|
175
175
|
try:
|
|
@@ -192,7 +192,7 @@ class Emissions(Model):
|
|
|
192
192
|
try:
|
|
193
193
|
edb_gaseous = self.edb_engine_gaseous[engine_uid] # type: ignore[index]
|
|
194
194
|
except KeyError:
|
|
195
|
-
self.source["thrust_setting"] = np.full(
|
|
195
|
+
self.source["thrust_setting"] = np.full(len(self.source), np.nan, dtype=np.float32)
|
|
196
196
|
else:
|
|
197
197
|
self.source["thrust_setting"] = get_thrust_setting(
|
|
198
198
|
edb_gaseous,
|
|
@@ -297,9 +297,9 @@ class Emissions(Model):
|
|
|
297
297
|
"""
|
|
298
298
|
self.source.attrs["gaseous_data_source"] = "Constant"
|
|
299
299
|
|
|
300
|
-
nox_ei = np.full(shape=len(self.source), fill_value=15.14)
|
|
301
|
-
co_ei = np.full(shape=len(self.source), fill_value=3.61)
|
|
302
|
-
hc_ei = np.full(shape=len(self.source), fill_value=0.520)
|
|
300
|
+
nox_ei = np.full(shape=len(self.source), fill_value=15.14, dtype=np.float32)
|
|
301
|
+
co_ei = np.full(shape=len(self.source), fill_value=3.61, dtype=np.float32)
|
|
302
|
+
hc_ei = np.full(shape=len(self.source), fill_value=0.520, dtype=np.float32)
|
|
303
303
|
|
|
304
304
|
self.source["nox_ei"] = nox_ei * 1e-3 # g-NOx/kg-fuel to kg-NOx/kg-fuel
|
|
305
305
|
self.source["co_ei"] = co_ei * 1e-3 # g-CO/kg-fuel to kg-CO/kg-fuel
|
|
@@ -493,8 +493,8 @@ class Emissions(Model):
|
|
|
493
493
|
- :cite:`schumannDehydrationEffectsContrails2015`
|
|
494
494
|
"""
|
|
495
495
|
nvpm_data_source = "Constant"
|
|
496
|
-
nvpm_ei_m = np.full(
|
|
497
|
-
nvpm_ei_n = np.full(
|
|
496
|
+
nvpm_ei_m = np.full(len(self.source), 0.088 * 1e-3, dtype=np.float32) # g to kg
|
|
497
|
+
nvpm_ei_n = np.full(len(self.source), self.params["default_nvpm_ei_n"], dtype=np.float32)
|
|
498
498
|
return nvpm_data_source, nvpm_ei_m, nvpm_ei_n
|
|
499
499
|
|
|
500
500
|
def _total_pollutant_emissions(self) -> None:
|
|
@@ -916,7 +916,7 @@ def get_thrust_setting(
|
|
|
916
916
|
)
|
|
917
917
|
|
|
918
918
|
thrust_setting = fuel_flow_per_engine / edb_gaseous.ff_100
|
|
919
|
-
thrust_setting.clip(0.03, 1, out=thrust_setting) # clip in place
|
|
919
|
+
thrust_setting.clip(0.03, 1.0, out=thrust_setting) # clip in place
|
|
920
920
|
return thrust_setting
|
|
921
921
|
|
|
922
922
|
|
|
@@ -121,7 +121,7 @@ class PSFlight(AircraftPerformance):
|
|
|
121
121
|
def eval_flight(self, fl: Flight) -> Flight:
|
|
122
122
|
# Ensure aircraft type is available
|
|
123
123
|
try:
|
|
124
|
-
aircraft_type = fl.
|
|
124
|
+
aircraft_type = fl.get_constant("aircraft_type")
|
|
125
125
|
except KeyError as exc:
|
|
126
126
|
msg = "`aircraft_type` required on flight attrs"
|
|
127
127
|
raise KeyError(msg) from exc
|
pycontrails/physics/constants.py
CHANGED
|
@@ -112,5 +112,6 @@ c_r: float = 0.9
|
|
|
112
112
|
# Flight
|
|
113
113
|
# ------
|
|
114
114
|
|
|
115
|
-
#: Nominal rate of climb/descent of aircraft [:math:`m \ s^{-1}
|
|
115
|
+
#: Nominal rate of climb/descent of aircraft [:math:`m \ s^{-1}`].
|
|
116
|
+
#: Note [:math:`12.7 m \ s^{-1} = 2500 ft \ min^{-1}`].
|
|
116
117
|
nominal_rocd: float = 12.7
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: pycontrails
|
|
3
|
-
Version: 0.54.
|
|
3
|
+
Version: 0.54.7
|
|
4
4
|
Summary: Python library for modeling aviation climate impacts
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: "Contrails.org" <py@contrails.org>
|
|
6
6
|
License: Apache-2.0
|
|
7
7
|
Project-URL: Changelog, https://py.contrails.org/changelog.html
|
|
8
8
|
Project-URL: Documentation, https://py.contrails.org
|
|
@@ -29,7 +29,7 @@ License-File: LICENSE
|
|
|
29
29
|
License-File: NOTICE
|
|
30
30
|
Requires-Dist: dask>=2022.3
|
|
31
31
|
Requires-Dist: numpy>=1.22
|
|
32
|
-
Requires-Dist: pandas>=2.
|
|
32
|
+
Requires-Dist: pandas>=2.0
|
|
33
33
|
Requires-Dist: scipy>=1.10
|
|
34
34
|
Requires-Dist: typing-extensions>=4.5; python_version < "3.12"
|
|
35
35
|
Requires-Dist: xarray>=2022.3
|
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
pycontrails/__init__.py,sha256=
|
|
2
|
-
pycontrails/_version.py,sha256=
|
|
1
|
+
pycontrails/__init__.py,sha256=mKNmGUS5wW1n1PukeaOkmLwQVN24i1__mk0odjBzwEE,2107
|
|
2
|
+
pycontrails/_version.py,sha256=Jkh_vvZO4qDhndLnoUinQrHjMORnNz_SExncTiuwXhQ,429
|
|
3
3
|
pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
pycontrails/core/__init__.py,sha256=kOAehIZBbvksSW3MuU2DfzsyeE4PaFnOTpYMeq2ZDPE,886
|
|
5
|
-
pycontrails/core/aircraft_performance.py,sha256=
|
|
6
|
-
pycontrails/core/airports.py,sha256=
|
|
5
|
+
pycontrails/core/aircraft_performance.py,sha256=7LxvxHB-2E2Qk1Kn0LG2eiUNFmN-Q-S76ZrDGPCI-P8,28066
|
|
6
|
+
pycontrails/core/airports.py,sha256=ELTH5P7SXs-LGxGfDPFCZnH7bs8GQ9SNbdLpLt7t6zk,7003
|
|
7
7
|
pycontrails/core/cache.py,sha256=NnlElV4ejshgyU2LMf5BtZGqmr1kZOxwz1hAT2Lq1ok,28953
|
|
8
8
|
pycontrails/core/coordinates.py,sha256=J5qjGuXgbLUw_U9_qREdgOaHl0ngK6Hbbjj3uw7FwNE,5565
|
|
9
9
|
pycontrails/core/fleet.py,sha256=ddujPC79K975gWVk8NDskE79OZaUam8tPR9rONaT918,17192
|
|
10
|
-
pycontrails/core/flight.py,sha256=
|
|
10
|
+
pycontrails/core/flight.py,sha256=jWGmeDDCZx6zjl5Xy-uLcKGeoIrLwcJ-nmYCSklbVLM,82824
|
|
11
11
|
pycontrails/core/flightplan.py,sha256=bcDjmJ-UR1gtuOLgAkCsRnwjJrz_l3n0nVRuj4_d9EU,7555
|
|
12
12
|
pycontrails/core/fuel.py,sha256=06YUDhvC8Rx6KbUXRB9qLTsJX2V7tLbzjwAfDH0R6l8,4472
|
|
13
13
|
pycontrails/core/interpolation.py,sha256=-GC3T6yh3nMtt7JCawoYeCUnDNRY9GHhxhkRhhnntxE,26437
|
|
14
|
-
pycontrails/core/met.py,sha256=
|
|
15
|
-
pycontrails/core/met_var.py,sha256=
|
|
16
|
-
pycontrails/core/models.py,sha256=
|
|
14
|
+
pycontrails/core/met.py,sha256=tKYowOqzpC6U6XPWgFmaAoYUH9yj0Kuw5ZMWQDil4js,106640
|
|
15
|
+
pycontrails/core/met_var.py,sha256=bFpBFpQnN6osVAuxNNhG6vG_NMThEIhDcL2B9VpXgww,12407
|
|
16
|
+
pycontrails/core/models.py,sha256=XCCyOpdDuLzvFQii9sjWabdJ6h9V9rukVlVM-yPiXBc,43612
|
|
17
17
|
pycontrails/core/polygon.py,sha256=NZ4YBhdALidXYOPsSX1cwGQ022j-AXgbWIQg7LA-f-I,18593
|
|
18
|
-
pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=
|
|
19
|
-
pycontrails/core/vector.py,sha256=
|
|
18
|
+
pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=PBbWMubyp3_ABYrBFHYRPQWGCqya-m8BLC64MEO2SZo,263680
|
|
19
|
+
pycontrails/core/vector.py,sha256=wtqE8o0ebt-J7_sD8BlsOlMmHVbevtFp9lfsGAwF-Jw,75488
|
|
20
20
|
pycontrails/datalib/__init__.py,sha256=Q2RrnjwtFzfsmJ2tEojDCzDMkd8R0MYw4mQz3YwUsqI,381
|
|
21
21
|
pycontrails/datalib/goes.py,sha256=eMo_A_Kxii3dTItp6_j6obvyT1NiGAr06RyYMuHZzd0,27327
|
|
22
22
|
pycontrails/datalib/landsat.py,sha256=YrDpngF5HtvWFVwxN0FLFxCfZIEmeBMiifdkbH7fQTk,20263
|
|
23
23
|
pycontrails/datalib/sentinel.py,sha256=ukzdSeHKC1UBWEYzehS2LqtKoCpKpaPobLfbZDGy6KU,17679
|
|
24
|
-
pycontrails/datalib/spire.py,sha256=aW0wh5GDrszFb20ZMzmWKQ4uHbOCmHvVt9Sf4U3AyTI,26070
|
|
25
24
|
pycontrails/datalib/_leo_utils/search.py,sha256=8JzT56ps3SH1W-5rwL8BWuxLLljwxa_5fjLAuZdL_Vg,8937
|
|
26
25
|
pycontrails/datalib/_leo_utils/vis.py,sha256=0UDVcqMRqHmAORDV4Xyk-HVnTAjbOCf7KCpWm2ilTLE,1861
|
|
27
26
|
pycontrails/datalib/_leo_utils/static/bq_roi_query.sql,sha256=r_gVjpoEvCcAJP56QlXaXzgfWPZdf-kYo3D316glJLU,266
|
|
@@ -40,12 +39,15 @@ pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv,sha256=9u7C
|
|
|
40
39
|
pycontrails/datalib/gfs/__init__.py,sha256=DGd8twOXwRZZhHx5muc9SJT-YET1KB599kS45_x3IbY,712
|
|
41
40
|
pycontrails/datalib/gfs/gfs.py,sha256=qh_nMDaSqkGs-YgibsmDWWXGtn6HY7EUqv5tve7IK5s,23055
|
|
42
41
|
pycontrails/datalib/gfs/variables.py,sha256=gmw5cs8RAeB-s9kCbnuKFp1K2SqNbc0lNR-JqhcenZY,3239
|
|
42
|
+
pycontrails/datalib/spire/__init__.py,sha256=HTeQFjMc1BJ189fALx5NDGX2IVZ0AUWC_Xu6LCsZduk,191
|
|
43
|
+
pycontrails/datalib/spire/exceptions.py,sha256=G8A68hbwPLYsXpluw7Q6TYJ1cJL-BmkKsiz93fHk-Kc,1776
|
|
44
|
+
pycontrails/datalib/spire/spire.py,sha256=EGgf6GtbtUtIIUyx9mMmfd9X9j6VixauTKn7g3JnZGw,24997
|
|
43
45
|
pycontrails/ext/bada.py,sha256=RmLDMaZQody8XUR-1I_5rPJqoz6eIq63IpDTcuJweoc,1133
|
|
44
46
|
pycontrails/ext/cirium.py,sha256=zRPVBBWwocZKkX3XhonSBf54x7P_xnjRcA7psI0Kqnw,429
|
|
45
47
|
pycontrails/ext/empirical_grid.py,sha256=mveQltokaGeQcxxbdMSLQ6wQ14oh3XX5dfzjWaFpxbk,4503
|
|
46
48
|
pycontrails/ext/synthetic_flight.py,sha256=6w2pC7DpbdHi3J1w5BL-8j3xCzYdP8N7FQ8dsMfDBpw,17226
|
|
47
49
|
pycontrails/models/__init__.py,sha256=TKhrXe1Pu1-mV1gctx8cUAMrVxCCAtBkbZi9olfWq8s,34
|
|
48
|
-
pycontrails/models/accf.py,sha256=
|
|
50
|
+
pycontrails/models/accf.py,sha256=llpEtvEqrA0N2iefEpj8wbObHPhWkuoMpfln0wu7fBc,14026
|
|
49
51
|
pycontrails/models/dry_advection.py,sha256=vDPjNrECefMvRVnfkhWCWbYQPpB2YYhGUvLiIuW10TM,19727
|
|
50
52
|
pycontrails/models/issr.py,sha256=J6mh4pze31XpD2_zD9ujzYPXsZFrmSwNcRORCcLoOVI,7588
|
|
51
53
|
pycontrails/models/pcc.py,sha256=7k8kICqDeZ99O2n2Zpnu7EFNGjEpPka_9cu9nrmP44s,11394
|
|
@@ -58,22 +60,22 @@ pycontrails/models/apcemm/inputs.py,sha256=zHRSWVVlwYw6ms7PpC0p0I-xFsRDUVY9eDZ1g
|
|
|
58
60
|
pycontrails/models/apcemm/utils.py,sha256=gew1MGtuOwKy0CTVKomJ_Lmuhmy4JxsopkughzCeB4o,17519
|
|
59
61
|
pycontrails/models/apcemm/static/apcemm_yaml_template.yaml,sha256=A3H_FWVOtqkZhG91TWLdblMKaLWIcjRMsKqkfTN6mB4,6928
|
|
60
62
|
pycontrails/models/cocip/__init__.py,sha256=v8JJN_Jx3_tOHaqGaQG-Es7srEAtSCHI7-gCEnM-n-s,991
|
|
61
|
-
pycontrails/models/cocip/cocip.py,sha256=
|
|
62
|
-
pycontrails/models/cocip/cocip_params.py,sha256=
|
|
63
|
+
pycontrails/models/cocip/cocip.py,sha256=R92HXUJA8QJrcCGy5-7v3yR7CAaHyabIBHoYGmVAiuk,106472
|
|
64
|
+
pycontrails/models/cocip/cocip_params.py,sha256=pk0fimh_Wz8g8Q75BIrsOlmeH85rbpHKttjp6rkcFGY,12833
|
|
63
65
|
pycontrails/models/cocip/cocip_uncertainty.py,sha256=fKQVAg-HyviegwNauxLgX9wdA0cRpK8XAOCNjZZIRWI,12528
|
|
64
66
|
pycontrails/models/cocip/contrail_properties.py,sha256=jF7iXFmMQEpyI3DNkRa7NFs-unx5a3HmmX6xs9FSJDQ,57734
|
|
65
67
|
pycontrails/models/cocip/output_formats.py,sha256=WpuSYTZ221kYUQNgUZGssdZlMXMy2GeCCiU13pCaAyI,85975
|
|
66
68
|
pycontrails/models/cocip/radiative_forcing.py,sha256=Zx7amTmIQHozuYyxfkryBJZVFDJws6a--By71TIMMIk,46297
|
|
67
69
|
pycontrails/models/cocip/radiative_heating.py,sha256=PcOEkqRtQJNq7bxOoz1baBbVV2ku1UQRMrrQXXsRBwc,19504
|
|
68
|
-
pycontrails/models/cocip/unterstrasser_wake_vortex.py,sha256=
|
|
70
|
+
pycontrails/models/cocip/unterstrasser_wake_vortex.py,sha256=0TE1gK2p0b7RQjBGRGgfg7BmzmdxbJLPJ-9sdlak1gQ,19444
|
|
69
71
|
pycontrails/models/cocip/wake_vortex.py,sha256=i6P1UDxde_WPP8SAliPdiaVCdeFMRxCFR7_zKaoNlno,14911
|
|
70
72
|
pycontrails/models/cocip/wind_shear.py,sha256=qhmP3RJ9SEjd-qnXcgRiYis9-apKGF-1d78z6N__tq8,3988
|
|
71
73
|
pycontrails/models/cocipgrid/__init__.py,sha256=OYSdZ1Htbr_IP7N_HuOAj1Pa_KLHtdEeJfXP-cN-gnU,271
|
|
72
|
-
pycontrails/models/cocipgrid/cocip_grid.py,sha256=
|
|
74
|
+
pycontrails/models/cocipgrid/cocip_grid.py,sha256=_mXGrCDtC3gfwdUXU5AOdS4m6HCFUEtW8vggTu7ZRVQ,93849
|
|
73
75
|
pycontrails/models/cocipgrid/cocip_grid_params.py,sha256=ZpN00VEmeRYaeZhvSfVjnEjrgn6XdClf1eqJC8Ytcuw,6013
|
|
74
76
|
pycontrails/models/emissions/__init__.py,sha256=phai3wH5VuUyfyVpu5vHOFI0jXSyoYSWvLTknS78xs0,499
|
|
75
|
-
pycontrails/models/emissions/black_carbon.py,sha256=
|
|
76
|
-
pycontrails/models/emissions/emissions.py,sha256=
|
|
77
|
+
pycontrails/models/emissions/black_carbon.py,sha256=o8mVfDZLnNlfnvsqk8O-ljXrMn4Y_ApFuPROAQWHaQY,21294
|
|
78
|
+
pycontrails/models/emissions/emissions.py,sha256=qczs_7m2HnpWe_Q_PlEE1_qMawrzfid5JyRmSEB3wi4,49110
|
|
77
79
|
pycontrails/models/emissions/ffm2.py,sha256=sWWzaV-5N2nNQlS0RxgKFwPzja5dehc99mfifTHW6pQ,12404
|
|
78
80
|
pycontrails/models/emissions/static/default-engine-uids.csv,sha256=6e-0Fjbka1www4o2CNtw2pW-g0s_E7hZQ6vOaR84Q5Y,6456
|
|
79
81
|
pycontrails/models/emissions/static/edb-gaseous-v29b-engines.csv,sha256=s-3_KGQyVoypXCHeQgsTDwdri-e3JVJn5SDxZo60m_s,128119
|
|
@@ -85,12 +87,12 @@ pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq,s
|
|
|
85
87
|
pycontrails/models/ps_model/__init__.py,sha256=fCGfdrJjK4K_EOODU8exmOFzedbABb3bMbuFi0gbrgc,571
|
|
86
88
|
pycontrails/models/ps_model/ps_aircraft_params.py,sha256=xs6-bCAhhOgN-LRDa7rUuuJdYM-bjDAMABLRayVhYwo,13731
|
|
87
89
|
pycontrails/models/ps_model/ps_grid.py,sha256=IhtCJF5FxJM7xYcc6jwPog91owe3dfkMwsOh6UTcrqI,26772
|
|
88
|
-
pycontrails/models/ps_model/ps_model.py,sha256
|
|
90
|
+
pycontrails/models/ps_model/ps_model.py,sha256=DAPAbajZVd2YHTcbiPK5w9X8ZkqYbSDq-5hrU3C7C8o,33268
|
|
89
91
|
pycontrails/models/ps_model/ps_operational_limits.py,sha256=95evggmtPbnr3kqNgqfOEJhbupK_D_ksONPmTm0k2B8,16966
|
|
90
92
|
pycontrails/models/ps_model/static/ps-aircraft-params-20240524.csv,sha256=2RtIHwXRuMVAEfsefopm1m6ozHi8YciYUN3WTMpfoo4,25852
|
|
91
93
|
pycontrails/models/ps_model/static/ps-synonym-list-20240524.csv,sha256=MLXOeVjC5FQULGNc6rn-_BdSURJAkJLMSDzPhC7OpDY,1141
|
|
92
94
|
pycontrails/physics/__init__.py,sha256=AScCMSMSZjKxfL6mssdSLwcja1ml7MzREThQp5PLr9U,45
|
|
93
|
-
pycontrails/physics/constants.py,sha256=
|
|
95
|
+
pycontrails/physics/constants.py,sha256=_MVuhk6GxxZhj5RL_ci6IAgSe4oJyxLZwBvpMuGcl3Q,3319
|
|
94
96
|
pycontrails/physics/geo.py,sha256=WyZKLj-63yGCfjePEhiwxLp26be44VCdEiisu9tXtzE,37461
|
|
95
97
|
pycontrails/physics/jet.py,sha256=z_MNEU7BVcy0sTtRbpKooS0Ynf4Ah5kVMDoLIeO-4Fg,31274
|
|
96
98
|
pycontrails/physics/thermo.py,sha256=HAcg2wmNXW-vJbOF2kOXBoUyJiAosPY0nRWeM37otdY,13238
|
|
@@ -103,9 +105,9 @@ pycontrails/utils/iteration.py,sha256=En2YY4NiNwCNtAVO8HL6tv9byBGKs8MKSI7R8P-gZy
|
|
|
103
105
|
pycontrails/utils/json.py,sha256=Pqashwoupuf_GfrrSfHclwug9Hg-kYQ4WNxEqay_0Rc,6083
|
|
104
106
|
pycontrails/utils/temp.py,sha256=5XXqQoEfWjz1OrhoOBZD5vkkCFeuq9LpZkyhc38gIeY,1159
|
|
105
107
|
pycontrails/utils/types.py,sha256=hPqUwaeRLgga69nj7LVbPojPg1k7pUSvYzFlGAiPKIM,5154
|
|
106
|
-
pycontrails-0.54.
|
|
107
|
-
pycontrails-0.54.
|
|
108
|
-
pycontrails-0.54.
|
|
109
|
-
pycontrails-0.54.
|
|
110
|
-
pycontrails-0.54.
|
|
111
|
-
pycontrails-0.54.
|
|
108
|
+
pycontrails-0.54.7.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
|
|
109
|
+
pycontrails-0.54.7.dist-info/METADATA,sha256=AZq6GUBX-wSYt5twiubQKHrcgpbFvbo-Wdyht8mKZwE,9288
|
|
110
|
+
pycontrails-0.54.7.dist-info/NOTICE,sha256=VIhzKNYi4lQx6fpZyqiY6eMHpLuwp-_G0JQkmYYa7h0,2005
|
|
111
|
+
pycontrails-0.54.7.dist-info/WHEEL,sha256=cRmSBGD-cl98KkuHMNqv9Ac9L9_VqTvcBYwpIvxN0cg,101
|
|
112
|
+
pycontrails-0.54.7.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
|
|
113
|
+
pycontrails-0.54.7.dist-info/RECORD,,
|