pycontrails 0.54.1__cp313-cp313-macosx_11_0_arm64.whl → 0.54.2__cp313-cp313-macosx_11_0_arm64.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,25 +1,25 @@
1
- pycontrails-0.54.1.dist-info/RECORD,,
2
- pycontrails-0.54.1.dist-info/LICENSE,sha256=gJ-h7SFFD1mCfR6a7HILvEtodDT6Iig8bLXdgqR6ucA,10175
3
- pycontrails-0.54.1.dist-info/WHEEL,sha256=L5Yzp3Ie3qzhKJYO8ywXtZfSISbcpXt4-U2h3P52Hng,109
4
- pycontrails-0.54.1.dist-info/NOTICE,sha256=gKI8DcN1WhiXB2SFRKDogcjONldGubTvBxiOYdC4CXU,1926
5
- pycontrails-0.54.1.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
6
- pycontrails-0.54.1.dist-info/METADATA,sha256=nnFiKTAtEVMBl81BkYHnQ6HHanzpEFtonQgABT0R28E,9074
7
- pycontrails/_version.py,sha256=k6EdzGzEntY3_PJAluVNA2mhyXh37neOah9DFH4IwDw,413
1
+ pycontrails-0.54.2.dist-info/RECORD,,
2
+ pycontrails-0.54.2.dist-info/LICENSE,sha256=gJ-h7SFFD1mCfR6a7HILvEtodDT6Iig8bLXdgqR6ucA,10175
3
+ pycontrails-0.54.2.dist-info/WHEEL,sha256=EhaGmhgTZV8uqhZxBmQmxqlBexDOCFpUXsFLjK8lF9g,109
4
+ pycontrails-0.54.2.dist-info/NOTICE,sha256=gKI8DcN1WhiXB2SFRKDogcjONldGubTvBxiOYdC4CXU,1926
5
+ pycontrails-0.54.2.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
6
+ pycontrails-0.54.2.dist-info/METADATA,sha256=Fm8kdIUhPRgD-eRj7pBLueySnBEN_UFAdNVOG0SbVMs,9155
7
+ pycontrails/_version.py,sha256=33yLgIixdFTAGWrLITOqgOcd0-lN-NKDJoFWt4PSyGE,413
8
8
  pycontrails/__init__.py,sha256=O2T9kXCMhcELcMZz7HEnwiBhh4Gfcj-yG1HtrotOKHQ,2001
9
9
  pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- pycontrails/core/vector.py,sha256=6ESLZ_mzZiehzCrwyb1Ib5zLnp3Vf37wHDmnx-RKWZQ,70530
10
+ pycontrails/core/vector.py,sha256=d0nzDeMFHzPjxqU4nbeb8i6a7hNCJr8qZU6CXEXtxCw,70042
11
11
  pycontrails/core/models.py,sha256=mB3fhmBorFxt7uEhBFcuu0PIMWmBRB4KBRsPiFpPcvo,39282
12
12
  pycontrails/core/interpolation.py,sha256=yxVLO9lzNcNFeLwDyrQ7yfz4JEHLHTpgIRBrcOezsXg,25617
13
- pycontrails/core/fleet.py,sha256=u4Mw57KPePSycBRvhVSbhr-7hQ2rTiEWXNagXIQKOuY,15551
14
- pycontrails/core/flight.py,sha256=SbXO0w8je7v4YASoEHu4mGzLvyUyMJp720JniHJBz5c,82909
13
+ pycontrails/core/fleet.py,sha256=s-4v3QtUIyIxdFc-f7sAaDGgmWqugR8H5uWsdnszYTI,15739
14
+ pycontrails/core/flight.py,sha256=VL2vi3YYW6TaUeBFf0TKTiCsaDmltN8c31WCKGWwjE8,82937
15
15
  pycontrails/core/fuel.py,sha256=kJZ3P1lPm1L6rdPREM55XQ-VfJ_pt35cP4sO2Nnvmjs,4332
16
16
  pycontrails/core/polygon.py,sha256=gosyZBX1XBKD2EcHycIZb7uM-xGs8rCfdpiSZlhc2Hc,18028
17
- pycontrails/core/cache.py,sha256=ly2Prq5CUxxc2pClZUXDeH-E8zkj3zZkLoKpdKUCyGs,27984
17
+ pycontrails/core/cache.py,sha256=7kGStSlHgF1JzU8piRCHVKuWHRECvsyTBemBs0jxplk,28068
18
18
  pycontrails/core/__init__.py,sha256=x1z6x8w3sYmEqYcNWyWHuNkS9lPUPbHUoYJZs1K0q98,856
19
- pycontrails/core/rgi_cython.cpython-313-darwin.so,sha256=WINa_38pnzKXRDWMN1encw7NZY6baZqVtHp3wttyuOo,311488
19
+ pycontrails/core/rgi_cython.cpython-313-darwin.so,sha256=mLmBVlLR4a1BLwjugkm16KahR1PbcngqhQTNOjc6mU0,311488
20
20
  pycontrails/core/flightplan.py,sha256=UO4vL087d5TZMlU984-FxfotGTxFbqK78w2fLDRiel4,7335
21
- pycontrails/core/met.py,sha256=vWUR2qNGvYrP4I9KKmk6rQoRkPV2mbvkNfxf2b7HV4U,100726
22
- pycontrails/core/aircraft_performance.py,sha256=BsYMMK80lpVzSYS8sem4xgigLUpwlXglql2qztaHp0M,26325
21
+ pycontrails/core/met.py,sha256=eCM4qJlNZNWLQt0USWIZBaDxxayHhta1tpRx37rBPY4,100821
22
+ pycontrails/core/aircraft_performance.py,sha256=uyT26bBYgQHOf3U3YVhR91BkSLCpaW6DBGmwmogDRB0,26417
23
23
  pycontrails/core/airports.py,sha256=aeyAXVkioIRomrP79UtNrxindL4f1DJyXFaojZCuBBw,6758
24
24
  pycontrails/core/met_var.py,sha256=GC5ijw4oGuIefmFOSz4vmxMEBj_SVs5Z75IMhDP56Cw,9183
25
25
  pycontrails/core/coordinates.py,sha256=0ySsHtqTon7GMbuwmmxMbI92j3ueMteJZh4xxNm5zto,5391
@@ -29,22 +29,22 @@ pycontrails/datalib/spire.py,sha256=66SnMdA8KOS69USjKmqrJmTKPK08Ehih9tnlsCt-AJw,
29
29
  pycontrails/datalib/__init__.py,sha256=hW9NWdFPC3y_2vHMteQ7GgQdop3917MkDaf5ZhU2RBY,369
30
30
  pycontrails/datalib/sentinel.py,sha256=pKB92KzKjvNOKnuxolXoz2ZnpXQ50iQ8g-EHDVMsnoA,17221
31
31
  pycontrails/datalib/_met_utils/metsource.py,sha256=BGActBGApWb4yI97nBS9ui5j-PzIQotFMUtbMEBkvm8,23966
32
- pycontrails/datalib/ecmwf/arco_era5.py,sha256=gezuXJo2gNT7WVK4xVwL8bPSxnPm8SGdj8g6THC4nXg,12348
33
- pycontrails/datalib/ecmwf/era5.py,sha256=VV-t0WUCDSpNzAlerWNJMjtownjLX3MSzxRdVaTMn3M,19014
34
- pycontrails/datalib/ecmwf/era5_model_level.py,sha256=Aey0juIzL2ZIAuPhFlsjTky9i45vKTT9gIeGxIrtIqs,19340
35
- pycontrails/datalib/ecmwf/hres.py,sha256=p_l0ytCEEWGam7G7aVynpLmH4H4LQNeVe0Ay7Tw6fp8,28240
32
+ pycontrails/datalib/ecmwf/arco_era5.py,sha256=7HXQU5S02PzX9Ew2ZrDKSp0tDEG1eeVAvbP3decmm20,12437
33
+ pycontrails/datalib/ecmwf/era5.py,sha256=QPkb5a8qW7yWpEq9wMiitql6V6kCHwdk9XNki_dlnZ4,19104
34
+ pycontrails/datalib/ecmwf/era5_model_level.py,sha256=KP4a9l2YbEhBPraN1LDx_I_OsOaJemAheW3gICqe5uA,19428
35
+ pycontrails/datalib/ecmwf/hres.py,sha256=7oGNi6FnLFIA5rCVVX5lRv_maXVMa2oqVPlT-sgFHsM,28325
36
36
  pycontrails/datalib/ecmwf/variables.py,sha256=G6LlGTrlzdn819F-7kjEMXT-Ystp1gc79LOmQTZKrtQ,9865
37
- pycontrails/datalib/ecmwf/hres_model_level.py,sha256=DiMw1cgbON_pu9ADjC0NC_itHSVa9n9zICLs1_iDq7c,17568
37
+ pycontrails/datalib/ecmwf/hres_model_level.py,sha256=EjBDYbbPZotTsveFlEiAAWJhhPYiao1DQrLyS4kVCrA,17657
38
38
  pycontrails/datalib/ecmwf/__init__.py,sha256=7OovwVTCo2DVH10NioUAc18evZkgb9b7Tn42S7tsJfU,2021
39
- pycontrails/datalib/ecmwf/common.py,sha256=PIkEdYEmlmwxQ7v4TenW_BaHX7mslnmdJW3iZYXb7Kg,3904
39
+ pycontrails/datalib/ecmwf/common.py,sha256=MCnOYb7Whz5M7s9iy91P6nNAu8in9x20-C8p_UQnuas,3996
40
40
  pycontrails/datalib/ecmwf/model_levels.py,sha256=_kgpnogaS6MlfvTX9dB5ASTHFUlZuQ_DRb-VADwEa0k,16996
41
- pycontrails/datalib/ecmwf/ifs.py,sha256=2heema398PoEVCfiTZSBawN25PXAa_CpWm_pGLZ1GuY,10662
41
+ pycontrails/datalib/ecmwf/ifs.py,sha256=Azs3vnSaXK65wblHgX88a4Hkmx1uy2NLERtJdoC1x_I,10750
42
42
  pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv,sha256=PmvGLRzn6uuCKSwiasSuVcehvvmSaqP7cnLuN6hhCQQ,9788
43
43
  pycontrails/datalib/_leo_utils/vis.py,sha256=-fLcm1D5cP6lThVHovV3MJSiadWyTUAvYDMvr4drMU4,1802
44
44
  pycontrails/datalib/_leo_utils/search.py,sha256=r87T2OV4qH1pYI2YznvsBL042f4RKxD3OA2snd3-kDI,8687
45
45
  pycontrails/datalib/_leo_utils/static/bq_roi_query.sql,sha256=xq6-tJyz0-bUwW0KjQymqygjH3WlQBmyBtP7Ci7SBe8,260
46
- pycontrails/datalib/gfs/gfs.py,sha256=fmYFf7KOGr91sFFCfThG61A3vauNis8TGIAZItIOsrY,21649
47
- pycontrails/datalib/gfs/variables.py,sha256=KESzB1sTD3hsU8T-qZFD29oFM3l2ZcEtjAE_H7BHKIE,2861
46
+ pycontrails/datalib/gfs/gfs.py,sha256=v7LZ1cdY3H3Las2PoVAdlW3CuMgzlOf7WW6SyD3Qt1c,22382
47
+ pycontrails/datalib/gfs/variables.py,sha256=4ALR4zhYW8tQVlNVHrd0CK8oRNSe_2OkW3ELeaImtAI,3135
48
48
  pycontrails/datalib/gfs/__init__.py,sha256=tWxgqmlW8Uo07J-3fBTXPrteatzTka9mSXomhWy3NVA,684
49
49
  pycontrails/ext/synthetic_flight.py,sha256=0mgS6DuwY2ZTzQBswRqh_CsqkUV8K4vGH1leynoz05U,16757
50
50
  pycontrails/ext/cirium.py,sha256=DFPfRwLDwddpucAPRQhyT4bDGh0VvvoViMUd3pidam8,415
@@ -76,13 +76,13 @@ pycontrails/models/apcemm/inputs.py,sha256=88GylkiaymEW_XZeFxLsICI9wV6kl8wVYsuyT
76
76
  pycontrails/models/apcemm/utils.py,sha256=xlEVe0RKFXrqDr4V77mbb2HxY8IK42EX4K86tN1sLQs,17094
77
77
  pycontrails/models/apcemm/apcemm.py,sha256=Qo3CdpQ5JULUit7Oi2l2_Mu8JXcW0QOYfQOyaL66ldM,39936
78
78
  pycontrails/models/apcemm/static/apcemm_yaml_template.yaml,sha256=uAZkc57OUvDMjgX6F5f6hgDh3Hgg1NbHWRUFSiv0DEI,6745
79
- pycontrails/models/humidity_scaling/humidity_scaling.py,sha256=9619kSgNIBjkM8vFWcwny7t4mhg00pX0aKabrDGPn7I,36658
79
+ pycontrails/models/humidity_scaling/humidity_scaling.py,sha256=7o2jTRfOqTkqAQPYQ-CdZAm5V5IZsp_RrVbTCQCdvZY,36745
80
80
  pycontrails/models/humidity_scaling/__init__.py,sha256=nqsab_j9BCwMbTfCn4BjXMdhItlvNKkgUJ9-lb8RyIo,1119
81
81
  pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq,sha256=tfYhbafF9Z-gGCg6VQ1YBlOaK_01e65Dc6s9b-hQ6Zo,286375
82
82
  pycontrails/models/humidity_scaling/quantiles/era5-model-level-quantiles.pq,sha256=pShCvNUo0NYtAHhT9IBRuj38X9jejdlKfv-ZoOKmtKI,35943
83
83
  pycontrails/models/cocip/radiative_forcing.py,sha256=aA4ZHaVOsg0lro04LwwKaBf3mXljRAzbwQpDLaxk4qU,44873
84
84
  pycontrails/models/cocip/wind_shear.py,sha256=p8d3iaNzxPA3MoxFEM1ZDKt0aticoD6U9cv0QmbuBzs,3860
85
- pycontrails/models/cocip/cocip.py,sha256=G0VwIGxGxC2kAqrJNqoXXogqZoiO3PtOzikTE2IHaTE,100088
85
+ pycontrails/models/cocip/cocip.py,sha256=hd5v3LtKomVGz2vUGHDIbffrip975utSun5iZKwRWA8,100180
86
86
  pycontrails/models/cocip/output_formats.py,sha256=7P0j-UX4NNw56Gkd3ZsWDt0ctorJTZ4aPmUiibAh1FM,83641
87
87
  pycontrails/models/cocip/__init__.py,sha256=jd-9Tq20s1kwQBlxsYfZLi3hlT5MnWOY2XsPazq1fgE,962
88
88
  pycontrails/models/cocip/cocip_params.py,sha256=kKTeF1vVQr361XBR79q4mQHYI7UUQ6C5Ik5Z5pJDtag,12703
@@ -92,7 +92,7 @@ pycontrails/models/cocip/radiative_heating.py,sha256=YRpwfXgFnf89iuJiIM96q-jbdcM
92
92
  pycontrails/models/cocip/contrail_properties.py,sha256=tycCxKf8j9GvVYDQBPxjtp6xLll-r00C0XW-w1jGbMI,55594
93
93
  pycontrails/models/cocip/unterstrasser_wake_vortex.py,sha256=kDxFpAIkcqqhGmwXoxv3_cSESj1Ur45GbLJF56IACJs,14573
94
94
  pycontrails/models/ps_model/__init__.py,sha256=5L-HympF1gJaZ6xiNkIQJygJhkDxM3-ejS_T2z-83hQ,495
95
- pycontrails/models/ps_model/ps_model.py,sha256=mhcSIq2ZGCScWpS2aVipvNKORv3QdspGme69Hm8LdvE,33411
95
+ pycontrails/models/ps_model/ps_model.py,sha256=l9ukna7amMvdq03Mk1wqw9JmBUWhpEGAqLoWWutg_4I,33502
96
96
  pycontrails/models/ps_model/ps_aircraft_params.py,sha256=-PfT2JC6RckVi_zTDVTqAMyaS-id6I2klUoXoEXreAc,13077
97
97
  pycontrails/models/ps_model/ps_operational_limits.py,sha256=_vFJiPqGuZJRzwuY10-z07-7eEyomnpxPm_Js1Cd5So,16832
98
98
  pycontrails/models/ps_model/ps_grid.py,sha256=AqZCEytWhrNbyujlJTufI4cxDonkPchGnrB3IvtRID4,18667
@@ -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: cp313-cp313-macosx_11_0_arm64
5
5