pycontrails 0.41.0__cp39-cp39-win_amd64.whl → 0.42.2__cp39-cp39-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.

Files changed (40) hide show
  1. pycontrails/_version.py +2 -2
  2. pycontrails/core/airports.py +228 -0
  3. pycontrails/core/cache.py +4 -6
  4. pycontrails/core/datalib.py +13 -6
  5. pycontrails/core/fleet.py +72 -20
  6. pycontrails/core/flight.py +485 -134
  7. pycontrails/core/flightplan.py +238 -0
  8. pycontrails/core/interpolation.py +11 -15
  9. pycontrails/core/met.py +5 -5
  10. pycontrails/core/models.py +4 -0
  11. pycontrails/core/rgi_cython.cp39-win_amd64.pyd +0 -0
  12. pycontrails/core/vector.py +80 -63
  13. pycontrails/datalib/__init__.py +1 -1
  14. pycontrails/datalib/ecmwf/common.py +14 -19
  15. pycontrails/datalib/spire/__init__.py +19 -0
  16. pycontrails/datalib/spire/spire.py +739 -0
  17. pycontrails/ext/bada/__init__.py +6 -6
  18. pycontrails/ext/cirium/__init__.py +2 -2
  19. pycontrails/models/cocip/cocip.py +37 -39
  20. pycontrails/models/cocip/cocip_params.py +37 -30
  21. pycontrails/models/cocip/cocip_uncertainty.py +47 -58
  22. pycontrails/models/cocip/radiative_forcing.py +220 -193
  23. pycontrails/models/cocip/wake_vortex.py +96 -91
  24. pycontrails/models/cocip/wind_shear.py +2 -2
  25. pycontrails/models/emissions/emissions.py +1 -1
  26. pycontrails/models/humidity_scaling.py +266 -9
  27. pycontrails/models/issr.py +2 -2
  28. pycontrails/models/pcr.py +1 -1
  29. pycontrails/models/quantiles/era5_ensemble_quantiles.npy +0 -0
  30. pycontrails/models/quantiles/iagos_quantiles.npy +0 -0
  31. pycontrails/models/sac.py +7 -5
  32. pycontrails/physics/geo.py +5 -3
  33. pycontrails/physics/jet.py +66 -113
  34. pycontrails/utils/json.py +3 -3
  35. {pycontrails-0.41.0.dist-info → pycontrails-0.42.2.dist-info}/METADATA +4 -7
  36. {pycontrails-0.41.0.dist-info → pycontrails-0.42.2.dist-info}/RECORD +40 -34
  37. {pycontrails-0.41.0.dist-info → pycontrails-0.42.2.dist-info}/LICENSE +0 -0
  38. {pycontrails-0.41.0.dist-info → pycontrails-0.42.2.dist-info}/NOTICE +0 -0
  39. {pycontrails-0.41.0.dist-info → pycontrails-0.42.2.dist-info}/WHEEL +0 -0
  40. {pycontrails-0.41.0.dist-info → pycontrails-0.42.2.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ import logging
12
12
  import numpy as np
13
13
  import numpy.typing as npt
14
14
 
15
- from pycontrails.core.flight import FlightPhase
15
+ from pycontrails.core import flight
16
16
  from pycontrails.physics import constants, units
17
17
  from pycontrails.utils.types import ArrayScalarLike
18
18
 
@@ -24,76 +24,20 @@ logger = logging.getLogger(__name__)
24
24
  # -------------------
25
25
 
26
26
 
27
- def identify_phase_of_flight(rocd: np.ndarray, *, threshold_rocd: float = 100.0) -> FlightPhase:
28
- """Identify the phase of flight (climb, cruise, descent) for each waypoint.
29
-
30
- Parameters
31
- ----------
32
- rocd: np.ndarray
33
- Rate of climb and descent, [:math:`ft min^{-1}`]
34
- threshold_rocd: float
35
- ROCD threshold to identify climb and descent, [:math:`ft min^{-1}`].
36
- Currently set to 100 ft/min.
37
-
38
- Returns
39
- -------
40
- FlightPhase
41
- Booleans marking if the waypoints are at cruise, climb, or descent
42
-
43
- Notes
44
- -----
45
- Flight data derived from ADS-B and radar sources could contain noise leading
46
- to small changes in altitude and ROCD. Hence, an arbitrary ``threshold_rocd``
47
- is specified to identify the different phases of flight.
48
- """
49
- nan = np.isnan(rocd)
50
- climb = rocd > threshold_rocd
51
- descent = rocd < -threshold_rocd
52
- cruise = ~(nan | climb | descent)
53
- return FlightPhase(cruise=cruise, climb=climb, descent=descent, nan=nan)
54
-
55
-
56
- def rate_of_climb_descent(
57
- dt: npt.NDArray[np.float_], altitude_ft: npt.NDArray[np.float_]
58
- ) -> npt.NDArray[np.float_]:
59
- """Calculate the rate of climb and descent (ROCD).
60
-
61
- Parameters
62
- ----------
63
- dt: npt.NDArray[np.float_]
64
- Time difference between waypoints, [:math:`s`].
65
- Expected to have numeric `dtype`, not `"timedelta64".
66
- altitude_ft: npt.NDArray[np.float_]
67
- Altitude of each waypoint, [:math:`ft`]
68
-
69
- Returns
70
- -------
71
- npt.NDArray[np.float_]
72
- Rate of climb and descent, [:math:`ft min^{-1}`]
73
- """
74
- dt_min = dt / 60.0
75
-
76
- out = np.empty_like(altitude_ft)
77
- out[:-1] = np.diff(altitude_ft) / dt_min[:-1]
78
- out[-1] = np.nan
79
-
80
- return out
81
-
82
-
83
27
  def clip_mach_number(
84
- true_airspeed: np.ndarray,
85
- air_temperature: np.ndarray,
28
+ true_airspeed: npt.NDArray[np.float_],
29
+ air_temperature: npt.NDArray[np.float_],
86
30
  max_mach_number: float,
87
- ) -> tuple[np.ndarray, np.ndarray]:
31
+ ) -> tuple[npt.NDArray[np.float_], npt.NDArray[np.float_]]:
88
32
  r"""Compute the Mach number from the true airspeed and ambient temperature.
89
33
 
90
34
  This method clips the computed Mach number to the value of `max_mach_number`.
91
35
 
92
36
  Parameters
93
37
  ----------
94
- true_airspeed : np.ndarray
38
+ true_airspeed : npt.NDArray[np.float_]
95
39
  Array of true airspeed, [:math:`m \ s^{-1}`]
96
- air_temperature : np.ndarray
40
+ air_temperature : npt.NDArray[np.float_]
97
41
  Array of ambient temperature, [:math: `K`]
98
42
  max_mach_number : float
99
43
  Maximum mach number associated to aircraft, [:math: `Ma`]. If no clipping
@@ -101,7 +45,7 @@ def clip_mach_number(
101
45
 
102
46
  Returns
103
47
  -------
104
- tuple[np.ndarray, np.ndarray] :
48
+ tuple[npt.NDArray[np.float_], npt.NDArray[np.float_]] :
105
49
  Pair of true airspeed and Mach number arrays. Both are corrected so that
106
50
  the Mach numbers are clipped at `max_mach_number`.
107
51
  """
@@ -110,8 +54,8 @@ def clip_mach_number(
110
54
  is_unrealistic = mach_num > max_mach_number
111
55
  if np.any(is_unrealistic):
112
56
  msg = (
113
- f"Unrealistic Mach numbers found. Discovered {np.sum(is_unrealistic)} "
114
- f"/ {is_unrealistic.size} values exceeding this, the largest of which "
57
+ f"Unrealistic Mach numbers found. Discovered {np.sum(is_unrealistic)} / "
58
+ f"{is_unrealistic.size} values exceeding this, the largest of which "
115
59
  f"is {np.nanmax(mach_num)}. These are all clipped at {max_mach_number}."
116
60
  )
117
61
  logger.debug(msg)
@@ -124,13 +68,13 @@ def clip_mach_number(
124
68
 
125
69
 
126
70
  def overall_propulsion_efficiency(
127
- true_airspeed: np.ndarray,
128
- F_thrust: np.ndarray,
129
- fuel_flow: np.ndarray,
71
+ true_airspeed: npt.NDArray[np.float_],
72
+ F_thrust: npt.NDArray[np.float_],
73
+ fuel_flow: npt.NDArray[np.float_],
130
74
  q_fuel: float,
131
- is_descent: np.ndarray | None,
75
+ is_descent: npt.NDArray[np.bool_] | None,
132
76
  threshold: float = 0.5,
133
- ) -> np.ndarray:
77
+ ) -> npt.NDArray[np.float_]:
134
78
  r"""Calculate the overall propulsion efficiency (OPE).
135
79
 
136
80
  Negative OPE values can occur during the descent phase and is clipped to a
@@ -139,22 +83,22 @@ def overall_propulsion_efficiency(
139
83
 
140
84
  Parameters
141
85
  ----------
142
- true_airspeed: np.ndarray
86
+ true_airspeed: npt.NDArray[np.float_]
143
87
  True airspeed for each waypoint, [:math:`m s^{-1}`].
144
- F_thrust: np.ndarray
88
+ F_thrust: npt.NDArray[np.float_]
145
89
  Thrust force provided by the engine, [:math:`N`].
146
- fuel_flow: np.ndarray
90
+ fuel_flow: npt.NDArray[np.float_]
147
91
  Fuel mass flow rate, [:math:`kg s^{-1}`].
148
92
  q_fuel : float
149
93
  Lower calorific value (LCV) of fuel, [:math:`J \ kg_{fuel}^{-1}`].
150
- is_descent : np.ndarray | None
94
+ is_descent : npt.NDArray[np.float_] | None
151
95
  Boolean array that indicates if a waypoint is in a descent phase.
152
96
  threshold : float
153
97
  Upper bound for realistic engine efficiency.
154
98
 
155
99
  Returns
156
100
  -------
157
- np.ndarray
101
+ npt.NDArray[np.float_]
158
102
  Overall propulsion efficiency (OPE)
159
103
 
160
104
  References
@@ -182,22 +126,24 @@ def overall_propulsion_efficiency(
182
126
  # -------------------
183
127
 
184
128
 
185
- def fuel_burn(fuel_flow: np.ndarray, dt: np.ndarray) -> np.ndarray:
129
+ def fuel_burn(
130
+ fuel_flow: npt.NDArray[np.float_], segment_duration: npt.NDArray[np.float_]
131
+ ) -> npt.NDArray[np.float_]:
186
132
  """Calculate the fuel consumption at each waypoint.
187
133
 
188
134
  Parameters
189
135
  ----------
190
- fuel_flow: np.ndarray
136
+ fuel_flow: npt.NDArray[np.float_]
191
137
  Fuel mass flow rate, [:math:`kg s^{-1}`]
192
- dt: np.ndarray
138
+ segment_duration: npt.NDArray[np.float_]
193
139
  Time difference between waypoints, [:math:`s`]
194
140
 
195
141
  Returns
196
142
  -------
197
- np.ndarray
143
+ npt.NDArray[np.float_]
198
144
  Fuel consumption at each waypoint, [:math:`kg`]
199
145
  """
200
- return fuel_flow * dt
146
+ return fuel_flow * segment_duration
201
147
 
202
148
 
203
149
  def equivalent_fuel_flow_rate_at_sea_level(
@@ -234,23 +180,28 @@ def equivalent_fuel_flow_rate_at_sea_level(
234
180
 
235
181
 
236
182
  def reserve_fuel_requirements(
237
- rocd: np.ndarray, fuel_flow: np.ndarray, fuel_burn: np.ndarray
183
+ rocd: npt.NDArray[np.float_],
184
+ altitude_ft: npt.NDArray[np.float_],
185
+ fuel_flow: npt.NDArray[np.float_],
186
+ fuel_burn: npt.NDArray[np.float_],
238
187
  ) -> float:
239
188
  r"""
240
189
  Estimate reserve fuel requirements.
241
190
 
242
191
  Parameters
243
192
  ----------
244
- rocd: np.ndarray
193
+ rocd: npt.NDArray[np.float_]
245
194
  Rate of climb and descent, [:math:`ft \ min^{-1}`]
246
- fuel_flow: np.ndarray
195
+ altitude_ft: npt.NDArray[np.float_]
196
+ Altitude, [:math:`ft`]
197
+ fuel_flow: npt.NDArray[np.float_]
247
198
  Fuel mass flow rate, [:math:`kg \ s^{-1}`].
248
- fuel_burn: np.ndarray
199
+ fuel_burn: npt.NDArray[np.float_]
249
200
  Fuel consumption for each waypoint, [:math:`kg`]
250
201
 
251
202
  Returns
252
203
  -------
253
- np.ndarray
204
+ npt.NDArray[np.float_]
254
205
  Reserve fuel requirements, [:math:`kg`]
255
206
 
256
207
  References
@@ -269,13 +220,15 @@ def reserve_fuel_requirements(
269
220
 
270
221
  See Also
271
222
  --------
272
- :func:`identify_phase_of_flight`
223
+ :func:`flight.segment_phase`
273
224
  :func:`fuel_burn`
274
225
  """
275
- phase_of_flight = identify_phase_of_flight(rocd)
226
+ segment_phase = flight.segment_phase(rocd, altitude_ft)
276
227
 
277
228
  # In case flight does not have cruise phase
278
- is_climb_cruise = phase_of_flight.climb | phase_of_flight.cruise
229
+ is_climb_cruise = (segment_phase == flight.FlightPhase.CLIMB) | (
230
+ segment_phase == flight.FlightPhase.CRUISE
231
+ )
279
232
 
280
233
  # If there are no climb and cruise phase, take the mean
281
234
  if not np.all(is_climb_cruise):
@@ -295,17 +248,17 @@ def reserve_fuel_requirements(
295
248
  # -------------------
296
249
 
297
250
 
298
- def aircraft_weight(aircraft_mass: np.ndarray) -> np.ndarray:
251
+ def aircraft_weight(aircraft_mass: npt.NDArray[np.float_]) -> npt.NDArray[np.float_]:
299
252
  """Calculate the aircraft weight at each waypoint.
300
253
 
301
254
  Parameters
302
255
  ----------
303
- aircraft_mass : np.ndarray
256
+ aircraft_mass : npt.NDArray[np.float_]
304
257
  Aircraft mass, [:math:`kg`]
305
258
 
306
259
  Returns
307
260
  -------
308
- np.ndarray
261
+ npt.NDArray[np.float_]
309
262
  Aircraft weight, [:math:`N`]
310
263
  """
311
264
  return aircraft_mass * constants.g
@@ -384,7 +337,7 @@ def update_aircraft_mass(
384
337
  Aircraft maximum take-off weight, [:math:`kg`].
385
338
  max_payload: float
386
339
  Aircraft maximum payload, [:math:`kg`]
387
- fuel_burn: np.ndarray
340
+ fuel_burn: npt.NDArray[np.float_]
388
341
  Fuel consumption for each waypoint, [:math:`kg`]
389
342
  total_reserve_fuel: float
390
343
  Total reserve fuel requirements, [:math:`kg`]
@@ -567,30 +520,30 @@ def turbine_inlet_temperature(
567
520
 
568
521
 
569
522
  def thrust_force(
570
- altitude: np.ndarray,
571
- true_airspeed: np.ndarray,
572
- dt: np.ndarray,
573
- aircraft_mass: np.ndarray,
574
- F_drag: np.ndarray,
575
- ) -> np.ndarray:
523
+ altitude: npt.NDArray[np.float_],
524
+ true_airspeed: npt.NDArray[np.float_],
525
+ dt: npt.NDArray[np.float_],
526
+ aircraft_mass: npt.NDArray[np.float_],
527
+ F_drag: npt.NDArray[np.float_],
528
+ ) -> npt.NDArray[np.float_]:
576
529
  r"""Calculate the thrust force at each waypoint.
577
530
 
578
531
  Parameters
579
532
  ----------
580
- altitude : np.ndarray
533
+ altitude : npt.NDArray[np.float_]
581
534
  Waypoint altitude, [:math:`m`]
582
- true_airspeed : np.ndarray
535
+ true_airspeed : npt.NDArray[np.float_]
583
536
  True airspeed, [:math:`m \ s^{-1}`]
584
- dt : np.ndarray
537
+ dt : npt.NDArray[np.float_]
585
538
  Time between waypoints, [:math:`s`]
586
- aircraft_mass : np.ndarray
539
+ aircraft_mass : npt.NDArray[np.float_]
587
540
  Aircraft mass, [:math:`kg`]
588
- F_drag : np.ndarray
541
+ F_drag : npt.NDArray[np.float_]
589
542
  Draft force, [:math:`N`]
590
543
 
591
544
  Returns
592
545
  -------
593
- np.ndarray
546
+ npt.NDArray[np.float_]
594
547
  Thrust force, [:math:`N`]
595
548
 
596
549
  References
@@ -728,49 +681,49 @@ def air_to_fuel_ratio(
728
681
  # -------------------
729
682
 
730
683
 
731
- def temperature_ratio(T: np.ndarray) -> np.ndarray:
684
+ def temperature_ratio(T: npt.NDArray[np.float_]) -> npt.NDArray[np.float_]:
732
685
  """Calculate the ratio of ambient temperature relative to the temperature at mean sea level.
733
686
 
734
687
  Parameters
735
688
  ----------
736
- T : np.ndarray
689
+ T : npt.NDArray[np.float_]
737
690
  Air temperature, [:math:`K`]
738
691
 
739
692
  Returns
740
693
  -------
741
- np.ndarray
694
+ npt.NDArray[np.float_]
742
695
  Ratio of the temperature to the temperature at mean sea-level (MSL).
743
696
  """
744
697
  return T / constants.T_msl
745
698
 
746
699
 
747
- def pressure_ratio(p: np.ndarray) -> np.ndarray:
700
+ def pressure_ratio(p: npt.NDArray[np.float_]) -> npt.NDArray[np.float_]:
748
701
  """Calculate the ratio of ambient pressure relative to the surface pressure.
749
702
 
750
703
  Parameters
751
704
  ----------
752
- p : np.ndarray
705
+ p : npt.NDArray[np.float_]
753
706
  Air pressure, [:math:`Pa`]
754
707
 
755
708
  Returns
756
709
  -------
757
- np.ndarray
710
+ npt.NDArray[np.float_]
758
711
  Ratio of the pressure altitude to the surface pressure.
759
712
  """
760
713
  return p / constants.p_surface
761
714
 
762
715
 
763
- def density_ratio(rho: np.ndarray) -> np.ndarray:
716
+ def density_ratio(rho: npt.NDArray[np.float_]) -> npt.NDArray[np.float_]:
764
717
  r"""Calculate the ratio of air density relative to the air density at mean-sea-level.
765
718
 
766
719
  Parameters
767
720
  ----------
768
- rho : np.ndarray
721
+ rho : npt.NDArray[np.float_]
769
722
  Air density, [:math:`kg \ m^{3}`]
770
723
 
771
724
  Returns
772
725
  -------
773
- np.ndarray
726
+ npt.NDArray[np.float_]
774
727
  Ratio of the density to the air density at mean sea-level (MSL).
775
728
  """
776
729
  return rho / constants.rho_msl
pycontrails/utils/json.py CHANGED
@@ -161,9 +161,9 @@ def dataframe_to_geojson_points(
161
161
 
162
162
  def row_to_feature(row: pd.Series) -> dict[str, str | dict[str, Any]]:
163
163
  point = [
164
- np.around(row.longitude, decimals=4) if not np.isnan(row.longitude) else None,
165
- np.around(row.latitude, decimals=4) if not np.isnan(row.latitude) else None,
166
- np.around(row.altitude, decimals=4) if not np.isnan(row.altitude) else None,
164
+ np.round(row.longitude, decimals=4) if not np.isnan(row.longitude) else None,
165
+ np.round(row.latitude, decimals=4) if not np.isnan(row.latitude) else None,
166
+ np.round(row.altitude, decimals=4) if not np.isnan(row.altitude) else None,
167
167
  ]
168
168
  # converting to int to allow JSON serialization
169
169
  properties = {"time": int(row.time.timestamp())}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.41.0
3
+ Version: 0.42.2
4
4
  Summary: Python library for modeling aviation climate impacts
5
5
  Author-email: Breakthrough Energy <py@contrails.org>
6
6
  License: Apache-2.0
@@ -34,12 +34,7 @@ Requires-Dist: pyproj (>=3.5)
34
34
  Requires-Dist: scipy (>=1.10)
35
35
  Requires-Dist: xarray (>=2022.3)
36
36
  Provides-Extra: complete
37
- Requires-Dist: pycontrails[ecmwf] ; extra == 'complete'
38
- Requires-Dist: pycontrails[gcp] ; extra == 'complete'
39
- Requires-Dist: pycontrails[gfs] ; extra == 'complete'
40
- Requires-Dist: pycontrails[jupyter] ; extra == 'complete'
41
- Requires-Dist: pycontrails[vis] ; extra == 'complete'
42
- Requires-Dist: pycontrails[zarr] ; extra == 'complete'
37
+ Requires-Dist: pycontrails[ecmwf,gcp,gfs,jupyter,pwlf,vis,zarr] ; extra == 'complete'
43
38
  Provides-Extra: dev
44
39
  Requires-Dist: black (>=22) ; extra == 'dev'
45
40
  Requires-Dist: black[jupyter] ; extra == 'dev'
@@ -96,6 +91,8 @@ Requires-Dist: ipywidgets (>=7.6) ; extra == 'jupyter'
96
91
  Requires-Dist: jupyterlab (>=2.2) ; extra == 'jupyter'
97
92
  Provides-Extra: open3d
98
93
  Requires-Dist: open3d (>=0.14) ; extra == 'open3d'
94
+ Provides-Extra: pwlf
95
+ Requires-Dist: pwlf (>=2.2.1) ; extra == 'pwlf'
99
96
  Provides-Extra: vis
100
97
  Requires-Dist: matplotlib (>=3.3) ; extra == 'vis'
101
98
  Requires-Dist: opencv-python-headless (>=4.5) ; extra == 'vis'
@@ -1,23 +1,25 @@
1
1
  pycontrails/__init__.py,sha256=n4f_-X3ryUqkFo1vI7G-fDyIs4iC83dvaIlUYlRHUEU,2014
2
- pycontrails/_version.py,sha256=goAZqwtSIjtG9W_nL9pCO5S5zoCW_6SmSU2mixADjTE,166
2
+ pycontrails/_version.py,sha256=DV5w0FxBOc0ieZdnbnOq2SN8N97gWalkx03aHRZYzwQ,166
3
3
  pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  pycontrails/core/__init__.py,sha256=ERJZtX_MJyVgxHTQFAcZtkK6lzeJRlpnFr9ZZbGKpto,897
5
- pycontrails/core/cache.py,sha256=ouuEjOlPZxvV0ghYPc4Q1kT1mgqW2HCa4oBiXwt8EWU,29412
5
+ pycontrails/core/airports.py,sha256=YFxXk8FFDdH_mjCqqYIrA0GOrTsOFm7LYD4N6S7Eprg,6994
6
+ pycontrails/core/cache.py,sha256=s4HHWDPmU0D9S5GNt3QDvYd4yTy7wQxdhKVC8WFDjkg,29304
6
7
  pycontrails/core/coordinates.py,sha256=TbttJt_UcntNI_SvjCTtGkXbqJeyGSFKtA6NM609lxU,5239
7
- pycontrails/core/datalib.py,sha256=QKUUZT1DqqJ_Bm2m-8eL9C3mXh9g1CEvBWyYJ2q_Ct0,22000
8
- pycontrails/core/fleet.py,sha256=pHIFwyGYgW7gKSScBKO6q0qwLOghucyJoa9q1pQyaQQ,12683
9
- pycontrails/core/flight.py,sha256=G7qYTnpZsbHqB8nlYf-STFC74SeL4uRp9zKhWg_OKqo,51022
8
+ pycontrails/core/datalib.py,sha256=zPOuzye-qH9L03D9nT-0wgqWHNFR7m_caUvTh21yZqo,22274
9
+ pycontrails/core/fleet.py,sha256=Vt9uUARpykWcTkFJJbFNdStXYTx3SI_tkDf5RQSOJ0k,14813
10
+ pycontrails/core/flight.py,sha256=_dDm_OqNIMWw6OOlUb7_LOOkFzRLTsffhP8J4iE-ptY,63760
11
+ pycontrails/core/flightplan.py,sha256=hphWAKNAlCMHuC49vwObkVYiZTZ4gG3s6kON8nSwzDE,7874
10
12
  pycontrails/core/fuel.py,sha256=IgsubrJ0T242QKAFaWKt-G3s4pVXs9xrG38EiaxXIpI,4173
11
- pycontrails/core/interpolation.py,sha256=py0Q0yI7qA4qfBEv1JN5qHNMdX1kIp6Bs-H50yrFEOg,24713
12
- pycontrails/core/met.py,sha256=W2f-m3zdG6hzXeuNbsiLdwpG6hbsGANjS5QcyFk8gLc,89282
13
+ pycontrails/core/interpolation.py,sha256=snwuKoqxUyDLvtVuoli3UsKwtkO9Dl3znaV5R6INdHM,24390
14
+ pycontrails/core/met.py,sha256=H6rWYE3s-_YC7vL2Gi44YwRA3pY0MBiW4Ye4NsSkH58,89132
13
15
  pycontrails/core/met_var.py,sha256=Ent1Na3lWwMWGsthnQcQUTkHvlNXC4oCRyx1mcg-QvA,9498
14
- pycontrails/core/models.py,sha256=KIFx9pI2liPPLxWJORpO5xjJwfyrznnCFpBWXTYwyS0,27563
16
+ pycontrails/core/models.py,sha256=UThmsakcBdZOYTiyFv9o0xSPJMAXY9u55vKTl4Ucimo,27744
15
17
  pycontrails/core/polygon.py,sha256=bvipvjyoZtOPWW2f8_X2YcC0FaJMmhoCM3OH1fVucA4,17146
16
- pycontrails/core/rgi_cython.cp39-win_amd64.pyd,sha256=ZHGayOmVdMCaYycr_IQ2x7Z_ewTztzlqpdZ5u5Cwu6Q,198144
17
- pycontrails/core/vector.py,sha256=R5sNNGF8bb8_21pE9B-KLvo2qJ5xhxHI44funuk4tKI,59695
18
- pycontrails/datalib/__init__.py,sha256=l5ugGiN1lg8vOc97TJ3Xe0Y3UkYmrK-Jlh7nTsd4Aqw,209
18
+ pycontrails/core/rgi_cython.cp39-win_amd64.pyd,sha256=G0B_djVkvIje-6KA_ZNH6-wYC6bskXAX_1maCU2cw_M,198144
19
+ pycontrails/core/vector.py,sha256=Gkl-HI7RXhlfITpmhnJi8kubGKzJvHkWlxzIcPypeS4,60276
20
+ pycontrails/datalib/__init__.py,sha256=WnXqgv20SrHZLjFZ9qpQEwRnf0QvfZU-YvMqh7PAUwg,246
19
21
  pycontrails/datalib/ecmwf/__init__.py,sha256=Qil0XaK3SpPFgTn-jZ2l4xsUwYhs1kp9fwNN1ctxh4A,1086
20
- pycontrails/datalib/ecmwf/common.py,sha256=1tQJIsnJ7xFQdEjxdx0RAG72jxRdq84LjCoJOkg4wFg,5022
22
+ pycontrails/datalib/ecmwf/common.py,sha256=_8mu73arA1MXPVoUJxetXzo_UllJSkRfZt2Nh4LuRGQ,4794
21
23
  pycontrails/datalib/ecmwf/era5.py,sha256=P28_RxbCDKxYDf76OReexBaItsi9LPGeZ0HnOnhicTU,20163
22
24
  pycontrails/datalib/ecmwf/hres.py,sha256=0KYaN1VHhl4PrxsGw3J81ah7sBBsPiMbf7djM8r31rI,31163
23
25
  pycontrails/datalib/ecmwf/ifs.py,sha256=0_kSrlbXrTpwm0M6xFF9gmSrYAIMN9zs7o-tqJ3PDlE,10725
@@ -25,26 +27,28 @@ pycontrails/datalib/ecmwf/variables.py,sha256=APjW0fwQ_euK7hmxNhlujcLjx7WN1CPa9D
25
27
  pycontrails/datalib/gfs/__init__.py,sha256=VcE2j62ITbY7F3tEtgaLrfyjHWci-4mvLtnVg3SVgtE,712
26
28
  pycontrails/datalib/gfs/gfs.py,sha256=bU80wKB5UQBrkOdHj79yXdKsLih7G8JQaCevjPjmiTc,23759
27
29
  pycontrails/datalib/gfs/variables.py,sha256=DHzhNaXEgcfZJCGUqfRyKcmnaJDMnMVKKC4KzbjrPKo,2959
28
- pycontrails/ext/bada/__init__.py,sha256=whbmKjOwJW0M6IhO8ztVpZ8c5l1ieOUkz4KZbmf98lE,1095
29
- pycontrails/ext/cirium/__init__.py,sha256=e5yUjoX5kK2_tuSaZLyZvI55PP3-rkTBzQEYbd8HJ_E,420
30
+ pycontrails/datalib/spire/__init__.py,sha256=YiS2SMSNU0bLHfbh41nQuKB8MnQNU8o3MldreM1nrM0,362
31
+ pycontrails/datalib/spire/spire.py,sha256=cEIx8eC4JBC9J8RJng902bpiWA9CKrWFJxX28Wwqr4M,26090
32
+ pycontrails/ext/bada/__init__.py,sha256=08M4NPJfi2N_tffJzflP-gFub-NAdLgRMk1TMaFzPyk,1100
33
+ pycontrails/ext/cirium/__init__.py,sha256=KJWOcMMgNJAkqYcxDU4NS4NoUYLJI6cOv5P4zzEv0yo,425
30
34
  pycontrails/models/__init__.py,sha256=TKhrXe1Pu1-mV1gctx8cUAMrVxCCAtBkbZi9olfWq8s,34
31
35
  pycontrails/models/accf.py,sha256=wdnWizzkaCu7C-qy_v511oSu8BOe6tGoXOW_A9oFbPE,12744
32
36
  pycontrails/models/aircraft_performance.py,sha256=OhLFdSu5f1Mh9-xcx0yDOPL4PSIRmmgwu7nm96VUDFU,1782
33
- pycontrails/models/humidity_scaling.py,sha256=m4N6ldMqbpijYFJmYX-lui_4QnaNa9lkarLY5bIq-yo,20511
34
- pycontrails/models/issr.py,sha256=RlURk_NziprDDhtSlcHTCBwVFmWm3ipm7AimS1XJEJM,7820
37
+ pycontrails/models/humidity_scaling.py,sha256=mn7SwizdsCIdg_vlYch9S3Jh_hU1sqw9fwSHMZSb00s,30235
38
+ pycontrails/models/issr.py,sha256=EIxY5hgGx7_BWJ0sNKizhKSTRBlbnWVAdOyZRz7on4c,7762
35
39
  pycontrails/models/pcc.py,sha256=n5TmzpMVw4vbDspD5f1Q6oM0U5Vbj9kA7M0xXj4cbyo,11617
36
- pycontrails/models/pcr.py,sha256=sS6j2htZsz6gAMSUbgWIFtKkCGHJXc7fR7fmQek8sz8,6095
37
- pycontrails/models/sac.py,sha256=4ENbgFxtnPHyYwcu7oG5iR7e2G_oRezS1YeYt68Yv2Y,16710
40
+ pycontrails/models/pcr.py,sha256=NNnaXR4JeK8XIbhDCLJsCRDumSVdZVcgmaEN6q-wtfI,6067
41
+ pycontrails/models/sac.py,sha256=_tkjX0Qf8pFOdlRERK1O5tXsNC8Gt0iuCrLlFMoHZAc,16617
38
42
  pycontrails/models/tau_cirrus.py,sha256=3zpjLXr68moOrjK3vSiCydINBxVkw-F5lF5pKWGcJpI,4642
39
43
  pycontrails/models/cocip/__init__.py,sha256=qkj5BtAqJky6hu1dNwkk_kn3kme2iDqRgGJnn5B6DvI,382
40
- pycontrails/models/cocip/cocip.py,sha256=CWk4iN_mzWCBR9ti3m-vBaNsfhukWEpSkrrWuWnIlyk,88824
41
- pycontrails/models/cocip/cocip_params.py,sha256=S3MLjqFzfOQ8aK5NKeN7bqEWlKzBV9qZSez5anL51yA,9332
42
- pycontrails/models/cocip/cocip_uncertainty.py,sha256=9y_oa4ZKS3pjnN_inKFopjtjGIQrCVn9UXboxamnbE0,12429
44
+ pycontrails/models/cocip/cocip.py,sha256=JFFbe_t4rbHuH8M2-A05nA46KBvrarEDR_ZjKO7ujew,88936
45
+ pycontrails/models/cocip/cocip_params.py,sha256=--vZbn-c62umyXZ1FWENbm6_Idkp_18iun1KuHn6Xhs,9454
46
+ pycontrails/models/cocip/cocip_uncertainty.py,sha256=ma4ZHZS5stCyJgVlCb1Vy-QjSbyaxG5PU4fr4ifr3Wg,12067
43
47
  pycontrails/models/cocip/contrail_properties.py,sha256=UqXPra10YMPY_P6eh23cVd30hxPriNK3oEBsqQYIeNQ,57135
44
- pycontrails/models/cocip/radiative_forcing.py,sha256=WX6gBX1zEeSInBHXBgoZiNIJ3nTJvxQM2sh-vTCb3XI,29690
48
+ pycontrails/models/cocip/radiative_forcing.py,sha256=FwE-1w8Q1IVQAoesZGljHXTI3iFXGhqSRKIcMJxSgbA,30919
45
49
  pycontrails/models/cocip/radiative_heating.py,sha256=k3HRZv2ik7SffG9FV7N8u2OIniudJKEmHQ95iQJKrxE,19295
46
- pycontrails/models/cocip/wake_vortex.py,sha256=dXeHr-OGt8UgPWecOpmanLSUQn4Fq9rxVCAXG5l7qVA,12016
47
- pycontrails/models/cocip/wind_shear.py,sha256=qMXF9XwaNLWrDnWpPTesJP0tmfBaWyeR2c1JsWIiBq0,3854
50
+ pycontrails/models/cocip/wake_vortex.py,sha256=5t3xA4jiGcySPMLu8Z_MYQBQbYxpe1nYOyyNe58iSjU,13181
51
+ pycontrails/models/cocip/wind_shear.py,sha256=ufZUJcxU-sPVS-egq1A0JefyxOH9-n1AUIjkh5z_naY,3846
48
52
  pycontrails/models/cocip/output/__init__.py,sha256=3TY2d0_fYj_Jh6umktdhdSkko2cP0r7blWa4Qq4rOCM,63
49
53
  pycontrails/models/cocip/output/flight_summary.py,sha256=e7oPCIp6Hk3zZsIzJNhzMbVRBCAKwxk76aoJ3JCinCw,9072
50
54
  pycontrails/models/cocip/output/grid_cirrus.py,sha256=mYFe1_6VDOO-C9dBbx8xjM-hJoEMOGdKGQHqiB8_d8M,25892
@@ -54,25 +58,27 @@ pycontrails/models/cocipgrid/cocip_grid_params.py,sha256=vVmZ2aIXUC7pWp859TZnXpr
54
58
  pycontrails/models/cocipgrid/cocip_time_handling.py,sha256=9mYkAx0eTbhtSBYtJrvFd7CiESQl3fHZCv5lmB5Ivjs,14166
55
59
  pycontrails/models/emissions/__init__.py,sha256=EwK6fQxbsnwukrQ9-Fv59ympcFgEPKtap2GZ4ro7bjA,127
56
60
  pycontrails/models/emissions/black_carbon.py,sha256=poh_OM1_4q3ZpmOqqAEqt_DbFpbMz3MfRjJtaRmMTx0,20716
57
- pycontrails/models/emissions/emissions.py,sha256=s80YxjY2FIpM5K3bx91_1-alMt7ujp3b5S113vM6r5g,45842
61
+ pycontrails/models/emissions/emissions.py,sha256=ngwoIiC0JPY3QVqSQQOmZuDdZ8xHt6UUiS3aqiZA2gY,45845
58
62
  pycontrails/models/emissions/ffm2.py,sha256=JICuusRlHp--Limr-9NWGbHS4zQKGzaa4B5ll5CGp4I,12274
59
63
  pycontrails/models/emissions/static/edb-gaseous-v28c-engines.csv,sha256=UJjnqdyOwkokzz3Vd5bSXCpn8Sm-mSygOdC8CrGhhqo,119459
60
64
  pycontrails/models/emissions/static/edb-nvpm-v28c-engines.csv,sha256=JKYYEd42dQSeNujub6HgwbUoVZG84iHzBY9YO086lxA,63651
65
+ pycontrails/models/quantiles/era5_ensemble_quantiles.npy,sha256=78NME7RD7-HIy8xZgXc2cyDnfffbzm6eVN7Tau-amZA,64208
66
+ pycontrails/models/quantiles/iagos_quantiles.npy,sha256=mdpQBBsCVUnv8B66xbIOqcNff9bO66wqkNV7V92zD2E,6536
61
67
  pycontrails/physics/__init__.py,sha256=AScCMSMSZjKxfL6mssdSLwcja1ml7MzREThQp5PLr9U,45
62
68
  pycontrails/physics/constants.py,sha256=Qf_7943-wlWC6sBr64GNv4Z6eD0W8UZyFWnd6-YEenk,3064
63
- pycontrails/physics/geo.py,sha256=Yau_LoTInnGQYr8xAqmi-f6hVUP6Sg2kNNWSl0L_RQQ,25914
64
- pycontrails/physics/jet.py,sha256=3dG8ajpblqU_zd1ugob2P-QIu3VNbN91JMt0JCHpXsM,23634
69
+ pycontrails/physics/geo.py,sha256=WY2LJzb3fUzUYQVBTKQK0JTaQvRVRsGOpRK_oYP_8Ew,26008
70
+ pycontrails/physics/jet.py,sha256=CStK4lLEzOu2MfXHo-AAtnMd6JowmGKRsxlvEXHq1XY,22802
65
71
  pycontrails/physics/thermo.py,sha256=_HkpS8EdzjRgdPNu7eLYC91-G4D25ZS-YfoEaYa9xlg,13266
66
72
  pycontrails/physics/units.py,sha256=SgMSqvoWu1MASDexkponfWKdlPCctvu3Qq6S-_WypfA,11795
67
73
  pycontrails/utils/__init__.py,sha256=VmklFC-5I5lGFQEzuomlPk_bM6CoM9XDljfjCovG3vw,33
68
74
  pycontrails/utils/iteration.py,sha256=jSII_Eb0kvDZz1uPiulTKVB4E0v3XJQurbSzpHqrFIQ,304
69
- pycontrails/utils/json.py,sha256=sOomUaRmAdOcFRjKTumXYCF7_DiQh8ePjgXTehpWav0,6183
75
+ pycontrails/utils/json.py,sha256=d2MJutSd4ZtVQFco70lURA2zuokFGryaTdKmjePd2qM,6180
70
76
  pycontrails/utils/synthetic_flight.py,sha256=FZF64zWX91UMdDLNlgpvPtIlIiO3COauo-wMe3W7PcQ,17020
71
77
  pycontrails/utils/temp.py,sha256=4S2BeY2mR5W_3gap3RyzQQmjwyuhJa7sOo68J1VrmWA,1150
72
78
  pycontrails/utils/types.py,sha256=ByKfuaQ6CSeQdOf_Wn_k93hkjDTNWf89bhCT9ErXQ5M,4685
73
- pycontrails-0.41.0.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
74
- pycontrails-0.41.0.dist-info/METADATA,sha256=_h_JQ4_paQIKYEN-IZQ59raSeORJF1WOUmLoq2LDcMk,8516
75
- pycontrails-0.41.0.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
76
- pycontrails-0.41.0.dist-info/WHEEL,sha256=eep6QWEFiQfg2wcclssb_WY-D33AnLYLnEKGA9Rn-VU,100
77
- pycontrails-0.41.0.dist-info/top_level.txt,sha256=dwaYXVcMhF92QWtAYcLvL0k02vyBqwhsv92lYs2V6zQ,23
78
- pycontrails-0.41.0.dist-info/RECORD,,
79
+ pycontrails-0.42.2.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
80
+ pycontrails-0.42.2.dist-info/METADATA,sha256=xyl17F0w-AYzi4XVhhnSIJEfIyVkfbDuAjPKm03voWg,8337
81
+ pycontrails-0.42.2.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
82
+ pycontrails-0.42.2.dist-info/WHEEL,sha256=eep6QWEFiQfg2wcclssb_WY-D33AnLYLnEKGA9Rn-VU,100
83
+ pycontrails-0.42.2.dist-info/top_level.txt,sha256=dwaYXVcMhF92QWtAYcLvL0k02vyBqwhsv92lYs2V6zQ,23
84
+ pycontrails-0.42.2.dist-info/RECORD,,