pycontrails 0.54.1__cp312-cp312-win_amd64.whl → 0.54.2__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.

@@ -9,18 +9,24 @@ References
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
+ import contextlib
12
13
  import hashlib
13
14
  import logging
14
15
  import pathlib
16
+ import sys
15
17
  import warnings
16
18
  from collections.abc import Callable
17
19
  from datetime import datetime
18
20
  from typing import TYPE_CHECKING, Any
19
21
 
22
+ if sys.version_info >= (3, 12):
23
+ from typing import override
24
+ else:
25
+ from typing_extensions import override
26
+
20
27
  import numpy as np
21
28
  import pandas as pd
22
29
  import xarray as xr
23
- from overrides import overrides
24
30
 
25
31
  import pycontrails
26
32
  from pycontrails.core import cache, met
@@ -82,6 +88,9 @@ class GFSForecast(metsource.MetDataSource):
82
88
  show_progress : bool, optional
83
89
  Show progress when downloading files from GFS AWS Bucket.
84
90
  Defaults to False
91
+ cache_download: bool, optional
92
+ If True, cache downloaded grib files rather than storing them in a temporary file.
93
+ By default, False.
85
94
 
86
95
  Examples
87
96
  --------
@@ -116,7 +125,7 @@ class GFSForecast(metsource.MetDataSource):
116
125
  - `GFS Documentation <https://www.emc.ncep.noaa.gov/emc/pages/numerical_forecast_systems/gfs/documentation.php>`_
117
126
  """
118
127
 
119
- __slots__ = ("client", "grid", "cachestore", "show_progress", "forecast_time")
128
+ __slots__ = ("client", "grid", "cachestore", "show_progress", "forecast_time", "cache_download")
120
129
 
121
130
  #: S3 client for accessing GFS bucket
122
131
  client: botocore.client.S3
@@ -142,7 +151,8 @@ class GFSForecast(metsource.MetDataSource):
142
151
  forecast_time: DatetimeLike | None = None,
143
152
  cachestore: cache.CacheStore | None = __marker, # type: ignore[assignment]
144
153
  show_progress: bool = False,
145
- ):
154
+ cache_download: bool = False,
155
+ ) -> None:
146
156
  try:
147
157
  import boto3
148
158
  except ModuleNotFoundError as e:
@@ -169,6 +179,7 @@ class GFSForecast(metsource.MetDataSource):
169
179
  cachestore = cache.DiskCacheStore()
170
180
  self.cachestore = cachestore
171
181
  self.show_progress = show_progress
182
+ self.cache_download = cache_download
172
183
 
173
184
  if time is None and paths is None:
174
185
  raise ValueError("Time input is required when paths is None")
@@ -349,7 +360,7 @@ class GFSForecast(metsource.MetDataSource):
349
360
  forecast_hour = str(self.forecast_time.hour).zfill(2)
350
361
  return f"gfs.t{forecast_hour}z.pgrb2.{self._grid_string}.f{step_hour}"
351
362
 
352
- @overrides
363
+ @override
353
364
  def create_cachepath(self, t: datetime) -> str:
354
365
  if self.cachestore is None:
355
366
  raise ValueError("self.cachestore attribute must be defined to create cache path")
@@ -366,7 +377,7 @@ class GFSForecast(metsource.MetDataSource):
366
377
  # return cache path
367
378
  return self.cachestore.path(f"{datestr}-{step}-{suffix}.nc")
368
379
 
369
- @overrides
380
+ @override
370
381
  def download_dataset(self, times: list[datetime]) -> None:
371
382
  # get step relative to forecast forecast_time
372
383
  logger.debug(
@@ -377,7 +388,7 @@ class GFSForecast(metsource.MetDataSource):
377
388
  for t in times:
378
389
  self._download_file(t)
379
390
 
380
- @overrides
391
+ @override
381
392
  def cache_dataset(self, dataset: xr.Dataset) -> None:
382
393
  # if self.cachestore is None:
383
394
  # LOG.debug("Cache is turned off, skipping")
@@ -385,7 +396,7 @@ class GFSForecast(metsource.MetDataSource):
385
396
 
386
397
  raise NotImplementedError("GFS caching only implemented with download")
387
398
 
388
- @overrides
399
+ @override
389
400
  def open_metdataset(
390
401
  self,
391
402
  dataset: xr.Dataset | None = None,
@@ -429,7 +440,7 @@ class GFSForecast(metsource.MetDataSource):
429
440
  # run the same GFS-specific processing on the dataset
430
441
  return self._process_dataset(ds, **kwargs)
431
442
 
432
- @overrides
443
+ @override
433
444
  def set_metadata(self, ds: xr.Dataset | met.MetDataset) -> None:
434
445
  ds.attrs.update(
435
446
  provider="NCEP",
@@ -462,24 +473,30 @@ class GFSForecast(metsource.MetDataSource):
462
473
  filename = self.filename(t)
463
474
  aws_key = f"{self.forecast_path}/{filename}"
464
475
 
476
+ stack = contextlib.ExitStack()
477
+ if self.cache_download:
478
+ target = self.cachestore.path(aws_key.replace("/", "-"))
479
+ else:
480
+ target = stack.enter_context(temp.temp_file())
481
+
465
482
  # Hold downloaded file in named temp file
466
- with temp.temp_file() as temp_grib_filename:
483
+ with stack:
467
484
  # retrieve data from AWS S3
468
- logger.debug(f"Downloading GFS file {filename} from AWS bucket to {temp_grib_filename}")
469
- if self.show_progress:
470
- _download_with_progress(
471
- self.client, GFS_FORECAST_BUCKET, aws_key, temp_grib_filename, filename
472
- )
473
- else:
474
- self.client.download_file(
475
- Bucket=GFS_FORECAST_BUCKET, Key=aws_key, Filename=temp_grib_filename
476
- )
485
+ logger.debug(f"Downloading GFS file {filename} from AWS bucket to {target}")
486
+ if not self.cache_download or not self.cachestore.exists(target):
487
+ self._make_download(aws_key, target, filename)
477
488
 
478
- ds = self._open_gfs_dataset(temp_grib_filename, t)
489
+ ds = self._open_gfs_dataset(target, t)
479
490
 
480
491
  cache_path = self.create_cachepath(t)
481
492
  ds.to_netcdf(cache_path)
482
493
 
494
+ def _make_download(self, aws_key: str, target: str, filename: str) -> None:
495
+ if self.show_progress:
496
+ _download_with_progress(self.client, GFS_FORECAST_BUCKET, aws_key, target, filename)
497
+ else:
498
+ self.client.download_file(Bucket=GFS_FORECAST_BUCKET, Key=aws_key, Filename=target)
499
+
483
500
  def _open_gfs_dataset(self, filepath: str | pathlib.Path, t: datetime) -> xr.Dataset:
484
501
  """Open GFS grib file for one forecast timestep.
485
502
 
@@ -502,7 +519,7 @@ class GFSForecast(metsource.MetDataSource):
502
519
  step = pd.Timedelta(t - self.forecast_time) // pd.Timedelta(1, "h")
503
520
 
504
521
  # open file for each variable short name individually
505
- ds: xr.Dataset | None = None
522
+ da_dict = {}
506
523
  for variable in self.variables:
507
524
  # Radiation data is not available in the 0th step
508
525
  is_radiation_step_zero = step == 0 and variable in (
@@ -519,23 +536,24 @@ class GFSForecast(metsource.MetDataSource):
519
536
  else:
520
537
  v = variable
521
538
 
522
- tmpds = xr.open_dataset(
523
- filepath,
524
- filter_by_keys={"typeOfLevel": v.level_type, "shortName": v.short_name},
525
- engine="cfgrib",
526
- )
527
-
528
- if ds is None:
529
- ds = tmpds
530
- else:
531
- ds[v.short_name] = tmpds[v.short_name]
539
+ try:
540
+ da = xr.open_dataarray(
541
+ filepath,
542
+ filter_by_keys={"typeOfLevel": v.level_type, "shortName": v.short_name},
543
+ engine="cfgrib",
544
+ )
545
+ except ValueError as exc:
546
+ # To debug this situation, you can use:
547
+ # import cfgrib
548
+ # cfgrib.open_datasets(filepath)
549
+ msg = f"Variable {v.short_name} not found in {filepath}"
550
+ raise ValueError(msg) from exc
532
551
 
533
- # set all radiation data to np.nan in the 0th step
534
552
  if is_radiation_step_zero:
535
- ds = ds.rename({Visibility.short_name: variable.short_name})
536
- ds[variable.short_name] = np.nan
553
+ da = xr.full_like(da, np.nan) # set all radiation data to np.nan in the 0th step
554
+ da_dict[variable.short_name] = da
537
555
 
538
- assert ds is not None, "No variables were loaded from grib file"
556
+ ds = xr.Dataset(da_dict)
539
557
 
540
558
  # for pressure levels, need to rename "level" field and downselect
541
559
  if self.pressure_levels != [-1]:
@@ -43,7 +43,9 @@ CloudIceWaterMixingRatio = MetVariable(
43
43
 
44
44
 
45
45
  TOAUpwardShortwaveRadiation = MetVariable(
46
- short_name="uswrf",
46
+ # Note the variable in the GFS Grib file is "uswrf" for the "nominalTop" level
47
+ # eccodes > 2.38 rewrites to `suswrf` on loading
48
+ short_name="suswrf",
47
49
  standard_name="toa_upward_shortwave_flux",
48
50
  long_name="Top of atmosphere upward shortwave radiation",
49
51
  units="W m**-2",
@@ -56,7 +58,9 @@ TOAUpwardShortwaveRadiation = MetVariable(
56
58
  )
57
59
 
58
60
  TOAUpwardLongwaveRadiation = MetVariable(
59
- short_name="ulwrf",
61
+ # Note the variable in the GFS Grib file is "ulwrf" for the "nominalTop" level
62
+ # eccodes > 2.38 rewrites to `sulwrf` on loading
63
+ short_name="sulwrf",
60
64
  standard_name="toa_upward_longwave_flux",
61
65
  long_name="Top of atmosphere upward longwave radiation",
62
66
  units="W m**-2",
@@ -3,15 +3,20 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import logging
6
+ import sys
6
7
  import warnings
7
8
  from collections.abc import Sequence
8
9
  from typing import Any, Literal, NoReturn, overload
9
10
 
11
+ if sys.version_info >= (3, 12):
12
+ from typing import override
13
+ else:
14
+ from typing_extensions import override
15
+
10
16
  import numpy as np
11
17
  import numpy.typing as npt
12
18
  import pandas as pd
13
19
  import xarray as xr
14
- from overrides import overrides
15
20
 
16
21
  from pycontrails.core import met_var
17
22
  from pycontrails.core.aircraft_performance import AircraftPerformance
@@ -1218,7 +1223,7 @@ class Cocip(Model):
1218
1223
 
1219
1224
  return self._downwash_contrail.filter(filt)
1220
1225
 
1221
- @overrides
1226
+ @override
1222
1227
  def _cleanup_indices(self) -> None:
1223
1228
  """Cleanup interpolation artifacts."""
1224
1229
 
@@ -7,14 +7,19 @@ import contextlib
7
7
  import dataclasses
8
8
  import functools
9
9
  import pathlib
10
+ import sys
10
11
  import warnings
11
12
  from typing import Any, NoReturn, overload
12
13
 
14
+ if sys.version_info >= (3, 12):
15
+ from typing import override
16
+ else:
17
+ from typing_extensions import override
18
+
13
19
  import numpy as np
14
20
  import numpy.typing as npt
15
21
  import pandas as pd
16
22
  import xarray as xr
17
- from overrides import overrides
18
23
 
19
24
  from pycontrails.core import models
20
25
  from pycontrails.core.met import MetDataArray, MetDataset
@@ -202,7 +207,7 @@ class ConstantHumidityScaling(HumidityScaling):
202
207
  default_params = ConstantHumidityScalingParams
203
208
  scaler_specific_keys = ("rhi_adj",)
204
209
 
205
- @overrides
210
+ @override
206
211
  def scale(
207
212
  self,
208
213
  specific_humidity: ArrayLike,
@@ -254,7 +259,7 @@ class ExponentialBoostHumidityScaling(HumidityScaling):
254
259
  default_params = ExponentialBoostHumidityScalingParams
255
260
  scaler_specific_keys = "rhi_adj", "rhi_boost_exponent", "clip_upper"
256
261
 
257
- @overrides
262
+ @override
258
263
  def scale(
259
264
  self,
260
265
  specific_humidity: ArrayLike,
@@ -408,7 +413,7 @@ class ExponentialBoostLatitudeCorrectionHumidityScaling(HumidityScaling):
408
413
  q_method = self.params["interpolation_q_method"]
409
414
  return {**super()._scale_kwargs(), "q_method": q_method}
410
415
 
411
- @overrides
416
+ @override
412
417
  def scale(
413
418
  self,
414
419
  specific_humidity: ArrayLike,
@@ -557,7 +562,7 @@ class HumidityScalingByLevel(HumidityScaling):
557
562
  "stratosphere_threshold",
558
563
  )
559
564
 
560
- @overrides
565
+ @override
561
566
  def scale(
562
567
  self,
563
568
  specific_humidity: ArrayLike,
@@ -825,7 +830,7 @@ class HistogramMatching(HumidityScaling):
825
830
  warnings.warn(msg, DeprecationWarning)
826
831
  super().__init__(met, params, **params_kwargs)
827
832
 
828
- @overrides
833
+ @override
829
834
  def scale(
830
835
  self,
831
836
  specific_humidity: ArrayLike,
@@ -976,7 +981,7 @@ class HistogramMatchingWithEckel(HumidityScaling):
976
981
 
977
982
  return self.source
978
983
 
979
- @overrides
984
+ @override
980
985
  def scale( # type: ignore[override]
981
986
  self,
982
987
  specific_humidity: npt.NDArray[np.float64],
@@ -5,13 +5,18 @@ from __future__ import annotations
5
5
  import dataclasses
6
6
  import functools
7
7
  import pathlib
8
+ import sys
8
9
  from collections.abc import Mapping
9
10
  from typing import Any, NoReturn, overload
10
11
 
12
+ if sys.version_info >= (3, 12):
13
+ from typing import override
14
+ else:
15
+ from typing_extensions import override
16
+
11
17
  import numpy as np
12
18
  import numpy.typing as npt
13
19
  import pandas as pd
14
- from overrides import overrides
15
20
 
16
21
  from pycontrails.core import flight
17
22
  from pycontrails.core.aircraft_performance import (
@@ -125,7 +130,7 @@ class PSFlight(AircraftPerformance):
125
130
  @overload
126
131
  def eval(self, source: None = ..., **params: Any) -> NoReturn: ...
127
132
 
128
- @overrides
133
+ @override
129
134
  def eval(self, source: Flight | None = None, **params: Any) -> Flight:
130
135
  self.update_params(params)
131
136
  self.set_source(source)
@@ -217,7 +222,7 @@ class PSFlight(AircraftPerformance):
217
222
 
218
223
  return fl
219
224
 
220
- @overrides
225
+ @override
221
226
  def calculate_aircraft_performance(
222
227
  self,
223
228
  *,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.54.1
3
+ Version: 0.54.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
@@ -29,10 +29,10 @@ 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: overrides>=6.1
33
32
  Requires-Dist: pandas>=2.2
34
33
  Requires-Dist: scipy>=1.10
35
34
  Requires-Dist: xarray>=2022.3
35
+ Requires-Dist: typing-extensions>=4.5; python_version < "3.12"
36
36
  Provides-Extra: complete
37
37
  Requires-Dist: pycontrails[ecmwf,gcp,gfs,jupyter,pyproj,sat,vis,zarr]; extra == "complete"
38
38
  Provides-Extra: dev
@@ -67,7 +67,7 @@ Requires-Dist: sphinxext.opengraph>=0.8; extra == "docs"
67
67
  Provides-Extra: ecmwf
68
68
  Requires-Dist: cdsapi>=0.4; extra == "ecmwf"
69
69
  Requires-Dist: cfgrib>=0.9; extra == "ecmwf"
70
- Requires-Dist: eccodes>=1.4; extra == "ecmwf"
70
+ Requires-Dist: eccodes>=2.38; extra == "ecmwf"
71
71
  Requires-Dist: ecmwf-api-client>=1.6; extra == "ecmwf"
72
72
  Requires-Dist: netcdf4>=1.6.1; extra == "ecmwf"
73
73
  Requires-Dist: platformdirs>=3.0; extra == "ecmwf"
@@ -79,7 +79,8 @@ Requires-Dist: tqdm>=4.61; extra == "gcp"
79
79
  Provides-Extra: gfs
80
80
  Requires-Dist: boto3>=1.20; extra == "gfs"
81
81
  Requires-Dist: cfgrib>=0.9; extra == "gfs"
82
- Requires-Dist: eccodes>=1.4; extra == "gfs"
82
+ Requires-Dist: eccodes>=2.38; extra == "gfs"
83
+ Requires-Dist: netcdf4>=1.6.1; extra == "gfs"
83
84
  Requires-Dist: platformdirs>=3.0; extra == "gfs"
84
85
  Requires-Dist: tqdm>=4.61; extra == "gfs"
85
86
  Provides-Extra: jupyter
@@ -1,22 +1,22 @@
1
1
  pycontrails/__init__.py,sha256=EpPulx2dBYpqZNsyh6HTwGGnFsvBVHBXabG5VInwSg4,2071
2
- pycontrails/_version.py,sha256=kaABJJ_hrJ3Rb5M_97qLMqoUHLUT6GrGqx7ZrJmYsc8,429
2
+ pycontrails/_version.py,sha256=mC3vkpyLEZ07amX98qZXKhkK9brNZvIS9DOK52GQrNw,429
3
3
  pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  pycontrails/core/__init__.py,sha256=X0DX2FGboPN_svwN2xiBzoPpHhDtg0oKFjXQfmCqMWU,886
5
- pycontrails/core/aircraft_performance.py,sha256=NkwdmV4R5u0RpVyldWDup1oanicStd3xxWYUdlRJbp4,26972
5
+ pycontrails/core/aircraft_performance.py,sha256=ZXw0asXC0SV0xc6Ks8e_ZLQCWxQlfVlL0T9xwnkXtwQ,27069
6
6
  pycontrails/core/airports.py,sha256=nGKXN3jOtzsDCaJZVFNO3e3w-U3lqMTz5Ww5jALiRJY,6984
7
- pycontrails/core/cache.py,sha256=9BctyrnZzBJWkLI1Y2KV8K6NIL2WNfXgd5eaL9k9IU8,28865
7
+ pycontrails/core/cache.py,sha256=W4N-bsw_6mkzcFiMfAmArMtlEP9OHVipjTeoniToQ3M,28953
8
8
  pycontrails/core/coordinates.py,sha256=J5qjGuXgbLUw_U9_qREdgOaHl0ngK6Hbbjj3uw7FwNE,5565
9
- pycontrails/core/fleet.py,sha256=MqVsuakmBQbG7_cat1-hogfMrsdfUvcbBm_84CF3b8o,16004
10
- pycontrails/core/flight.py,sha256=2tgjRMdRYdYwnCl5NJjLPbPCZxORn_r5Nu6FLVbVNic,85155
9
+ pycontrails/core/fleet.py,sha256=X2gDpK9d_IedzkLQdPhtT9sKu7n05kLSFpXpTfPmuPE,16202
10
+ pycontrails/core/flight.py,sha256=bwUiGPCnIOcHD4S-kLcfrG29qQfiptf3pAvY3uheyQs,85191
11
11
  pycontrails/core/flightplan.py,sha256=0ozSt3jqa62PZBjXnEDQLbZO1YORg3r2552RpRtkKZA,7555
12
12
  pycontrails/core/fuel.py,sha256=06YUDhvC8Rx6KbUXRB9qLTsJX2V7tLbzjwAfDH0R6l8,4472
13
13
  pycontrails/core/interpolation.py,sha256=AYG5PKkBKlCZpje7HNi8P7wlbikds76QMlJnlRrCKFs,26338
14
- pycontrails/core/met.py,sha256=tMI53vYxefm7MZyL_d6_4OeNxd2oaetd6v4IPBzeWMQ,103544
14
+ pycontrails/core/met.py,sha256=fdLHJXjyazaZ75UQXBPg3ZVZjhNGUS_tjp0x4v5hVPk,103651
15
15
  pycontrails/core/met_var.py,sha256=iLk8R2Yq2MCnc7_XJLUULqojBwe1seFp3jdaTm8T-BY,9490
16
16
  pycontrails/core/models.py,sha256=KWDCVzpg-0pfp7075XtLlNm-ALuthPm4KSowr9Wn21Y,40463
17
17
  pycontrails/core/polygon.py,sha256=F403uzql_c47MPM2Qdmec6WwtFaXZyb48h-4gK-K4EU,18577
18
- pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=75PZJgQ4Eh_7Y8VJnuTTFqzBwQo5o9yMCURxP5IWgR8,265216
19
- pycontrails/core/vector.py,sha256=c9eZw50NViaj19mWY9G5NwJaAYAXbWKJMXbOL3Ka0W8,72689
18
+ pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=dlXUeoj70MePy4SD971BCN8Kx-CSG_4wgRV9Njtlsx4,265216
19
+ pycontrails/core/vector.py,sha256=VZi7sSjgchJN6vu7Xabf-OC_J85-DwbeOCC7SM8M9IY,72201
20
20
  pycontrails/datalib/__init__.py,sha256=Q2RrnjwtFzfsmJ2tEojDCzDMkd8R0MYw4mQz3YwUsqI,381
21
21
  pycontrails/datalib/goes.py,sha256=UMxXXCiRL6SHY5_3cXs8GmG19eeKOOi3gKCimkyZSuc,27305
22
22
  pycontrails/datalib/landsat.py,sha256=bxk_3cOLndOguYkzyg9dLU2YNhGHYwrAOaQY_NkdPq8,20290
@@ -27,19 +27,19 @@ pycontrails/datalib/_leo_utils/vis.py,sha256=0UDVcqMRqHmAORDV4Xyk-HVnTAjbOCf7KCp
27
27
  pycontrails/datalib/_leo_utils/static/bq_roi_query.sql,sha256=r_gVjpoEvCcAJP56QlXaXzgfWPZdf-kYo3D316glJLU,266
28
28
  pycontrails/datalib/_met_utils/metsource.py,sha256=8-f6Aee9wAG3RlVc2rnK-b1LKrtwABiPBd_1uEgM3dg,24712
29
29
  pycontrails/datalib/ecmwf/__init__.py,sha256=l5AXK1UEt7OG7H-VTfEE-fvtesEqVagHM8ZqkElF1m0,2094
30
- pycontrails/datalib/ecmwf/arco_era5.py,sha256=dnF9W4QJ3qe78Qlb7dmWxOwn6hDhkztxQ-JKZ4uh94k,12688
31
- pycontrails/datalib/ecmwf/common.py,sha256=GxyNnQMjIfM26SahTRNtQD7Gfd3evX32f7dTUjEatYY,4013
32
- pycontrails/datalib/ecmwf/era5.py,sha256=CJFn3g8k7g-wNdUv6ClWho2qd9XU2dYLcyVAytnFZ18,19564
33
- pycontrails/datalib/ecmwf/era5_model_level.py,sha256=nbkGk8kLMlYAX8JkfoTQZ4cxefFvCsmcHaV1vwahTbA,19827
34
- pycontrails/datalib/ecmwf/hres.py,sha256=NnpwQartFGxd6n3wIkSzZQiqHtimq5d9zUYxf7SDhiQ,29022
35
- pycontrails/datalib/ecmwf/hres_model_level.py,sha256=FtX8QWW9fAFFxMRKS694ArTbIKNJmGEIzjnNsrOqm0g,18027
36
- pycontrails/datalib/ecmwf/ifs.py,sha256=XzRZFutdf8TaHCAq1H7dmlC-hym8X-p8uluOwN1ToCw,10946
30
+ pycontrails/datalib/ecmwf/arco_era5.py,sha256=PojAfT0N12SLcgiecZtHiN96sbRWwFx3PThrXIwSX5M,12782
31
+ pycontrails/datalib/ecmwf/common.py,sha256=1RCMZEYjSB83iGvEc5d3a8ShyZlc0EIAtE38XSC98UA,4110
32
+ pycontrails/datalib/ecmwf/era5.py,sha256=Z44my_mS5WARp6BFwuvnGZp-sI8Z8v8Sf_5KdpTPaq0,19659
33
+ pycontrails/datalib/ecmwf/era5_model_level.py,sha256=0uZiRFgj4dTvx4f92butomAof2yuMM-VY-SFnIovyNY,19919
34
+ pycontrails/datalib/ecmwf/hres.py,sha256=PMos1_JlqlLdmus0yz4ZR1257hKRnl0uRqRaH9oht_g,29112
35
+ pycontrails/datalib/ecmwf/hres_model_level.py,sha256=ghrN-z5bjV-ztv6L5KlGiCLlGR9ABbAe5k38CaARmLU,18121
36
+ pycontrails/datalib/ecmwf/ifs.py,sha256=_JM2s5UvPDQu7Rdmx2dcxBIyZrKC7gvHqurR3sSqWxw,11039
37
37
  pycontrails/datalib/ecmwf/model_levels.py,sha256=noLSx45AHZ0rFPiUh3aK3iaEueHgsg6mG_AplHqHeU8,17431
38
38
  pycontrails/datalib/ecmwf/variables.py,sha256=nWHVbTsvGShjxJIrbgE0NgXNPlsefyU4ebSYY2tDTlY,10132
39
39
  pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv,sha256=9u7CVA3QnPUmNLIWUkF5b9wFunczkvx1zSudwGmtOv8,9927
40
40
  pycontrails/datalib/gfs/__init__.py,sha256=VcE2j62ITbY7F3tEtgaLrfyjHWci-4mvLtnVg3SVgtE,712
41
- pycontrails/datalib/gfs/gfs.py,sha256=v1ksUzy980JQ1OoognXki8eBUywqh1-87Nr76ehcSeg,22295
42
- pycontrails/datalib/gfs/variables.py,sha256=u2rAsjCJTehB6MhQj9YhlZYovdwoscqAH33T5aBDzSw,2961
41
+ pycontrails/datalib/gfs/gfs.py,sha256=8HjxUebIhO6xA94-Nu9o8BAXiccpYrpJJ7SODbQ0Cko,23046
42
+ pycontrails/datalib/gfs/variables.py,sha256=gmw5cs8RAeB-s9kCbnuKFp1K2SqNbc0lNR-JqhcenZY,3239
43
43
  pycontrails/ext/bada.py,sha256=S0qfNYsp1cGqkHGPu-IkAwk66lD79yikRlrq9uwgPpI,1104
44
44
  pycontrails/ext/cirium.py,sha256=zRPVBBWwocZKkX3XhonSBf54x7P_xnjRcA7psI0Kqnw,429
45
45
  pycontrails/ext/empirical_grid.py,sha256=1WHyt1VOWEr7bMlnXo1tEKJgePvLKjKsCCee2w22gf8,4502
@@ -58,7 +58,7 @@ pycontrails/models/apcemm/inputs.py,sha256=zHRSWVVlwYw6ms7PpC0p0I-xFsRDUVY9eDZ1g
58
58
  pycontrails/models/apcemm/utils.py,sha256=6pKQbS5EAzTnI_edVtUvGrzM0xwNq1t9MBGgCRJtg_0,17531
59
59
  pycontrails/models/apcemm/static/apcemm_yaml_template.yaml,sha256=A3H_FWVOtqkZhG91TWLdblMKaLWIcjRMsKqkfTN6mB4,6928
60
60
  pycontrails/models/cocip/__init__.py,sha256=miDxSFxN9PzL_ieSJb3BYeHmbKqZwGicCz1scNB5eW0,991
61
- pycontrails/models/cocip/cocip.py,sha256=sStHyoTImaMVrvZKLrmX7c8IOARN-d5qYcxAlZJISm0,102704
61
+ pycontrails/models/cocip/cocip.py,sha256=qDjRhFmBR6ggj0yqF9uoKbdkFw7nwKMKiQn92gnsiT4,102801
62
62
  pycontrails/models/cocip/cocip_params.py,sha256=JwQl8FLcp4l5-MLiMQhPsxHL8jKXg2ymWXD7Jbn3zTQ,13002
63
63
  pycontrails/models/cocip/cocip_uncertainty.py,sha256=7W586BJEAY_wpSpfVdcdX-HpZG4twk3cMLhUR2ELTMA,12176
64
64
  pycontrails/models/cocip/contrail_properties.py,sha256=u6SvucHC6VtF2kujfSVFTfv0263t5uYpNOUJZAroEzc,57111
@@ -79,13 +79,13 @@ pycontrails/models/emissions/static/default-engine-uids.csv,sha256=6e-0Fjbka1www
79
79
  pycontrails/models/emissions/static/edb-gaseous-v29b-engines.csv,sha256=s-3_KGQyVoypXCHeQgsTDwdri-e3JVJn5SDxZo60m_s,128119
80
80
  pycontrails/models/emissions/static/edb-nvpm-v29b-engines.csv,sha256=MwLLrcATd38KPddTpHpMGBrZuA4I7he-1B5otTp4ar8,77533
81
81
  pycontrails/models/humidity_scaling/__init__.py,sha256=-xqDCJzKJx2nX6yl-gglHheQHWDhkvb8X7atbMJT2LA,1156
82
- pycontrails/models/humidity_scaling/humidity_scaling.py,sha256=WEe-0rMTJFPzbsXuHVHLeUCHr552C73TlxIUhdKCOmA,37683
82
+ pycontrails/models/humidity_scaling/humidity_scaling.py,sha256=CdOmWLPEd__wpGt8EMXT3PAM8W_iLUw9njG-N-w9Urw,37775
83
83
  pycontrails/models/humidity_scaling/quantiles/era5-model-level-quantiles.pq,sha256=pShCvNUo0NYtAHhT9IBRuj38X9jejdlKfv-ZoOKmtKI,35943
84
84
  pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq,sha256=tfYhbafF9Z-gGCg6VQ1YBlOaK_01e65Dc6s9b-hQ6Zo,286375
85
85
  pycontrails/models/ps_model/__init__.py,sha256=QggqLRpqUh6imcn7GFPcKFSU4s3WjgfdvO8hH_OO8NY,512
86
86
  pycontrails/models/ps_model/ps_aircraft_params.py,sha256=ZqY9VEnFmYQ10ZMHBUfcIE4RF3iml9ctp0YF2v4Lg0I,13453
87
87
  pycontrails/models/ps_model/ps_grid.py,sha256=DIUItUslzJARa_Ly_SUGur8_D3Ph6_qBX1BNcL2g4mI,19172
88
- pycontrails/models/ps_model/ps_model.py,sha256=ld4lsqamNTOGT2cZsI7KnH6qRfxwuzvoxmtjEsGr24o,34443
88
+ pycontrails/models/ps_model/ps_model.py,sha256=f_wwvVMmuNDRohCjYf9mUzLtugKEfzU-zbZgbYle0fo,34539
89
89
  pycontrails/models/ps_model/ps_operational_limits.py,sha256=hpgNkS1Xx7mjTSoNzfGoy50Yv9LNWfBDAVgPfa1c31k,17372
90
90
  pycontrails/models/ps_model/static/ps-aircraft-params-20240524.csv,sha256=2RtIHwXRuMVAEfsefopm1m6ozHi8YciYUN3WTMpfoo4,25852
91
91
  pycontrails/models/ps_model/static/ps-synonym-list-20240524.csv,sha256=MLXOeVjC5FQULGNc6rn-_BdSURJAkJLMSDzPhC7OpDY,1141
@@ -101,9 +101,9 @@ pycontrails/utils/iteration.py,sha256=En2YY4NiNwCNtAVO8HL6tv9byBGKs8MKSI7R8P-gZy
101
101
  pycontrails/utils/json.py,sha256=OHfKm4b9VeToxNBJM6gh3eI1xkTPDbvmXvWhHtsNr94,6102
102
102
  pycontrails/utils/temp.py,sha256=5XXqQoEfWjz1OrhoOBZD5vkkCFeuq9LpZkyhc38gIeY,1159
103
103
  pycontrails/utils/types.py,sha256=pqyqz8oXE4cfsx0z2ctWrNnIQavpF8uVZaH2a5fqNak,4934
104
- pycontrails-0.54.1.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
105
- pycontrails-0.54.1.dist-info/METADATA,sha256=h6retfYiAie3K0AtpwLu_T1yl9X5Oi_zkWezzVfj5NI,9253
106
- pycontrails-0.54.1.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
107
- pycontrails-0.54.1.dist-info/WHEEL,sha256=3vidnDuZ-QSnHIxLhNbI1gIM-KgyEcMHuZuv1mWPd_Q,101
108
- pycontrails-0.54.1.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
109
- pycontrails-0.54.1.dist-info/RECORD,,
104
+ pycontrails-0.54.2.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
105
+ pycontrails-0.54.2.dist-info/METADATA,sha256=3F18VHx2UQSxtomFOEDYFMjMqWWGDZFX5e3ZOBQqAm0,9335
106
+ pycontrails-0.54.2.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
107
+ pycontrails-0.54.2.dist-info/WHEEL,sha256=62QJgqtUFevqILau0n0UncooEMoOyVCKVQitJpcuCig,101
108
+ pycontrails-0.54.2.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
109
+ pycontrails-0.54.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-win_amd64
5
5