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.
- pycontrails/_version.py +2 -2
- pycontrails/core/aircraft_performance.py +7 -2
- pycontrails/core/cache.py +14 -10
- pycontrails/core/fleet.py +22 -12
- pycontrails/core/flight.py +22 -14
- pycontrails/core/met.py +34 -22
- pycontrails/core/rgi_cython.cp312-win_amd64.pyd +0 -0
- pycontrails/core/vector.py +38 -38
- pycontrails/datalib/ecmwf/arco_era5.py +10 -5
- pycontrails/datalib/ecmwf/common.py +7 -2
- pycontrails/datalib/ecmwf/era5.py +9 -4
- pycontrails/datalib/ecmwf/era5_model_level.py +9 -5
- pycontrails/datalib/ecmwf/hres.py +12 -7
- pycontrails/datalib/ecmwf/hres_model_level.py +10 -5
- pycontrails/datalib/ecmwf/ifs.py +11 -6
- pycontrails/datalib/gfs/gfs.py +52 -34
- pycontrails/datalib/gfs/variables.py +6 -2
- pycontrails/models/cocip/cocip.py +7 -2
- pycontrails/models/humidity_scaling/humidity_scaling.py +12 -7
- pycontrails/models/ps_model/ps_model.py +8 -3
- {pycontrails-0.54.1.dist-info → pycontrails-0.54.2.dist-info}/METADATA +5 -4
- {pycontrails-0.54.1.dist-info → pycontrails-0.54.2.dist-info}/RECORD +26 -26
- {pycontrails-0.54.1.dist-info → pycontrails-0.54.2.dist-info}/WHEEL +1 -1
- {pycontrails-0.54.1.dist-info → pycontrails-0.54.2.dist-info}/LICENSE +0 -0
- {pycontrails-0.54.1.dist-info → pycontrails-0.54.2.dist-info}/NOTICE +0 -0
- {pycontrails-0.54.1.dist-info → pycontrails-0.54.2.dist-info}/top_level.txt +0 -0
pycontrails/datalib/gfs/gfs.py
CHANGED
|
@@ -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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
|
483
|
+
with stack:
|
|
467
484
|
# retrieve data from AWS S3
|
|
468
|
-
logger.debug(f"Downloading GFS file {filename} from AWS bucket to {
|
|
469
|
-
if self.
|
|
470
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
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
|
-
|
|
536
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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.
|
|
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>=
|
|
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>=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
10
|
-
pycontrails/core/flight.py,sha256=
|
|
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=
|
|
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=
|
|
19
|
-
pycontrails/core/vector.py,sha256=
|
|
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=
|
|
31
|
-
pycontrails/datalib/ecmwf/common.py,sha256=
|
|
32
|
-
pycontrails/datalib/ecmwf/era5.py,sha256=
|
|
33
|
-
pycontrails/datalib/ecmwf/era5_model_level.py,sha256=
|
|
34
|
-
pycontrails/datalib/ecmwf/hres.py,sha256=
|
|
35
|
-
pycontrails/datalib/ecmwf/hres_model_level.py,sha256=
|
|
36
|
-
pycontrails/datalib/ecmwf/ifs.py,sha256=
|
|
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=
|
|
42
|
-
pycontrails/datalib/gfs/variables.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
105
|
-
pycontrails-0.54.
|
|
106
|
-
pycontrails-0.54.
|
|
107
|
-
pycontrails-0.54.
|
|
108
|
-
pycontrails-0.54.
|
|
109
|
-
pycontrails-0.54.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|