pycontrails 0.52.0__cp312-cp312-win_amd64.whl → 0.52.1__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/coordinates.py +5 -5
- pycontrails/core/flight.py +4 -4
- pycontrails/core/interpolation.py +2 -2
- pycontrails/core/met.py +23 -14
- pycontrails/core/polygon.py +1 -1
- pycontrails/core/rgi_cython.cp312-win_amd64.pyd +0 -0
- pycontrails/core/vector.py +1 -1
- pycontrails/datalib/_met_utils/metsource.py +0 -4
- pycontrails/datalib/goes.py +10 -3
- pycontrails/models/cocip/cocip_uncertainty.py +9 -9
- pycontrails/models/cocip/output_formats.py +3 -2
- pycontrails/physics/geo.py +1 -1
- {pycontrails-0.52.0.dist-info → pycontrails-0.52.1.dist-info}/METADATA +18 -7
- {pycontrails-0.52.0.dist-info → pycontrails-0.52.1.dist-info}/RECORD +19 -19
- {pycontrails-0.52.0.dist-info → pycontrails-0.52.1.dist-info}/WHEEL +1 -1
- {pycontrails-0.52.0.dist-info → pycontrails-0.52.1.dist-info}/LICENSE +0 -0
- {pycontrails-0.52.0.dist-info → pycontrails-0.52.1.dist-info}/NOTICE +0 -0
- {pycontrails-0.52.0.dist-info → pycontrails-0.52.1.dist-info}/top_level.txt +0 -0
pycontrails/_version.py
CHANGED
pycontrails/core/coordinates.py
CHANGED
|
@@ -59,27 +59,27 @@ def slice_domain(
|
|
|
59
59
|
>>> # Call with request as np.array
|
|
60
60
|
>>> request = np.linspace(-20, 20, 100)
|
|
61
61
|
>>> slice_domain(domain, request)
|
|
62
|
-
slice(640, 801, None)
|
|
62
|
+
slice(np.int64(640), np.int64(801), None)
|
|
63
63
|
|
|
64
64
|
>>> # Call with request as tuple
|
|
65
65
|
>>> request = -20, 20
|
|
66
66
|
>>> slice_domain(domain, request)
|
|
67
|
-
slice(640, 801, None)
|
|
67
|
+
slice(np.int64(640), np.int64(801), None)
|
|
68
68
|
|
|
69
69
|
>>> # Call with a buffer
|
|
70
70
|
>>> request = -16, 13
|
|
71
71
|
>>> buffer = 4, 7
|
|
72
72
|
>>> slice_domain(domain, request, buffer)
|
|
73
|
-
slice(640, 801, None)
|
|
73
|
+
slice(np.int64(640), np.int64(801), None)
|
|
74
74
|
|
|
75
75
|
>>> # Call with request as a single number
|
|
76
76
|
>>> request = -20
|
|
77
77
|
>>> slice_domain(domain, request)
|
|
78
|
-
slice(640, 641, None)
|
|
78
|
+
slice(np.int64(640), np.int64(641), None)
|
|
79
79
|
|
|
80
80
|
>>> request = -19.9
|
|
81
81
|
>>> slice_domain(domain, request)
|
|
82
|
-
slice(640, 642, None)
|
|
82
|
+
slice(np.int64(640), np.int64(642), None)
|
|
83
83
|
|
|
84
84
|
"""
|
|
85
85
|
# if the length of domain coordinates is <= 2, return the whole domain
|
pycontrails/core/flight.py
CHANGED
|
@@ -384,7 +384,7 @@ class Flight(GeoVectorDataset):
|
|
|
384
384
|
... time=pd.date_range('2021-01-01T12', '2021-01-01T14', periods=200),
|
|
385
385
|
... )
|
|
386
386
|
>>> fl.max_distance_gap
|
|
387
|
-
7391.27...
|
|
387
|
+
np.float64(7391.27...)
|
|
388
388
|
"""
|
|
389
389
|
if self.attrs["crs"] != "EPSG:4326":
|
|
390
390
|
raise NotImplementedError("Only implemented for EPSG:4326 CRS.")
|
|
@@ -415,7 +415,7 @@ class Flight(GeoVectorDataset):
|
|
|
415
415
|
... time=pd.date_range('2021-01-01T12', '2021-01-01T14', periods=200),
|
|
416
416
|
... )
|
|
417
417
|
>>> fl.length
|
|
418
|
-
1436924.67...
|
|
418
|
+
np.float64(1436924.67...)
|
|
419
419
|
"""
|
|
420
420
|
if self.attrs["crs"] != "EPSG:4326":
|
|
421
421
|
raise NotImplementedError("Only implemented for EPSG:4326 CRS.")
|
|
@@ -1520,11 +1520,11 @@ class Flight(GeoVectorDataset):
|
|
|
1520
1520
|
|
|
1521
1521
|
>>> # Length (in meters) of waypoints whose temperature exceeds 236K
|
|
1522
1522
|
>>> fl.length_met("air_temperature", threshold=236)
|
|
1523
|
-
4132178.159...
|
|
1523
|
+
np.float64(4132178.159...)
|
|
1524
1524
|
|
|
1525
1525
|
>>> # Proportion (with respect to distance) of waypoints whose temperature exceeds 236K
|
|
1526
1526
|
>>> fl.proportion_met("air_temperature", threshold=236)
|
|
1527
|
-
0.663552...
|
|
1527
|
+
np.float64(0.663552...)
|
|
1528
1528
|
"""
|
|
1529
1529
|
if key not in self.data:
|
|
1530
1530
|
raise KeyError(f"Column {key} does not exist in data.")
|
|
@@ -621,11 +621,11 @@ class EmissionsProfileInterpolator:
|
|
|
621
621
|
>>> epi = EmissionsProfileInterpolator(xp, fp)
|
|
622
622
|
>>> # Interpolate a single value
|
|
623
623
|
>>> epi.interp(5)
|
|
624
|
-
0.150000...
|
|
624
|
+
np.float64(0.150000...)
|
|
625
625
|
|
|
626
626
|
>>> # Interpolate a single value on a logarithmic scale
|
|
627
627
|
>>> epi.log_interp(5)
|
|
628
|
-
1.105171...
|
|
628
|
+
np.float64(1.105171...)
|
|
629
629
|
|
|
630
630
|
>>> # Demonstrate speed up compared with xarray.DataArray interpolation
|
|
631
631
|
>>> import time, xarray as xr
|
pycontrails/core/met.py
CHANGED
|
@@ -1375,9 +1375,10 @@ class MetDataArray(MetBase):
|
|
|
1375
1375
|
|
|
1376
1376
|
# try to create DataArray out of input data and **kwargs
|
|
1377
1377
|
if not isinstance(data, xr.DataArray):
|
|
1378
|
-
|
|
1378
|
+
warnings.warn(
|
|
1379
1379
|
"Input 'data' must be an xarray DataArray. "
|
|
1380
|
-
"Passing arbitrary kwargs will be removed in future versions."
|
|
1380
|
+
"Passing arbitrary kwargs will be removed in future versions.",
|
|
1381
|
+
DeprecationWarning,
|
|
1381
1382
|
)
|
|
1382
1383
|
data = xr.DataArray(data, **kwargs)
|
|
1383
1384
|
|
|
@@ -2609,13 +2610,14 @@ def _load(hash: str, cachestore: CacheStore, chunks: dict[str, int]) -> xr.Datas
|
|
|
2609
2610
|
|
|
2610
2611
|
|
|
2611
2612
|
def _add_vertical_coords(data: XArrayType) -> XArrayType:
|
|
2612
|
-
"""Add "air_pressure" and "altitude" coordinates to data.
|
|
2613
|
+
"""Add "air_pressure" and "altitude" coordinates to data.
|
|
2613
2614
|
|
|
2614
|
-
|
|
2615
|
+
.. versionchanged:: 0.52.1
|
|
2616
|
+
Ensure that the ``dtype`` of the additional vertical coordinates agree
|
|
2617
|
+
with the ``dtype`` of the underlying gridded data.
|
|
2618
|
+
"""
|
|
2615
2619
|
|
|
2616
|
-
|
|
2617
|
-
if "air_pressure" in coords and "altitude" in coords:
|
|
2618
|
-
return data
|
|
2620
|
+
data["level"].attrs.update(units="hPa", long_name="Pressure", positive="down")
|
|
2619
2621
|
|
|
2620
2622
|
# XXX: use the dtype of the data to determine the precision of these coordinates
|
|
2621
2623
|
# There are two competing conventions here:
|
|
@@ -2625,25 +2627,32 @@ def _add_vertical_coords(data: XArrayType) -> XArrayType:
|
|
|
2625
2627
|
# It is more important for air_pressure and altitude to be grid-aligned than to be
|
|
2626
2628
|
# coordinate-aligned, so we use the dtype of the data to determine the precision of
|
|
2627
2629
|
# these coordinates
|
|
2628
|
-
|
|
2629
|
-
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2630
|
+
dtype = (
|
|
2631
|
+
np.result_type(*data.data_vars.values(), np.float32)
|
|
2632
|
+
if isinstance(data, xr.Dataset)
|
|
2633
|
+
else data.dtype
|
|
2634
|
+
)
|
|
2633
2635
|
|
|
2634
|
-
|
|
2636
|
+
level = data["level"].values
|
|
2637
|
+
|
|
2638
|
+
if "air_pressure" not in data.coords:
|
|
2635
2639
|
data = data.assign_coords(air_pressure=("level", level * 100.0))
|
|
2636
2640
|
data.coords["air_pressure"].attrs.update(
|
|
2637
2641
|
standard_name=AirPressure.standard_name,
|
|
2638
2642
|
long_name=AirPressure.long_name,
|
|
2639
2643
|
units=AirPressure.units,
|
|
2640
2644
|
)
|
|
2641
|
-
if "
|
|
2645
|
+
if data.coords["air_pressure"].dtype != dtype:
|
|
2646
|
+
data.coords["air_pressure"] = data.coords["air_pressure"].astype(dtype, copy=False)
|
|
2647
|
+
|
|
2648
|
+
if "altitude" not in data.coords:
|
|
2642
2649
|
data = data.assign_coords(altitude=("level", units.pl_to_m(level)))
|
|
2643
2650
|
data.coords["altitude"].attrs.update(
|
|
2644
2651
|
standard_name=Altitude.standard_name,
|
|
2645
2652
|
long_name=Altitude.long_name,
|
|
2646
2653
|
units=Altitude.units,
|
|
2647
2654
|
)
|
|
2655
|
+
if data.coords["altitude"].dtype != dtype:
|
|
2656
|
+
data.coords["altitude"] = data.coords["altitude"].astype(dtype, copy=False)
|
|
2648
2657
|
|
|
2649
2658
|
return data
|
pycontrails/core/polygon.py
CHANGED
|
Binary file
|
pycontrails/core/vector.py
CHANGED
|
@@ -2057,7 +2057,7 @@ def vector_to_lon_lat_grid(
|
|
|
2057
2057
|
[2.97, 0.12, 1.33, ..., 3.54, 0.74, 2.59]])
|
|
2058
2058
|
|
|
2059
2059
|
>>> da.sum().item() == vector["foo"].sum()
|
|
2060
|
-
|
|
2060
|
+
np.True_
|
|
2061
2061
|
|
|
2062
2062
|
"""
|
|
2063
2063
|
df = vector.select(("longitude", "latitude", *agg), copy=False).dataframe
|
|
@@ -35,9 +35,6 @@ DEFAULT_CHUNKS: dict[str, int] = {"time": 1}
|
|
|
35
35
|
#: Whether to open multi-file datasets in parallel
|
|
36
36
|
OPEN_IN_PARALLEL: bool = False
|
|
37
37
|
|
|
38
|
-
#: Whether to use file locking when opening multi-file datasets
|
|
39
|
-
OPEN_WITH_LOCK: bool = False
|
|
40
|
-
|
|
41
38
|
|
|
42
39
|
def parse_timesteps(time: TimeInput | None, freq: str | None = "1h") -> list[datetime]:
|
|
43
40
|
"""Parse time input into set of time steps.
|
|
@@ -741,5 +738,4 @@ class MetDataSource(abc.ABC):
|
|
|
741
738
|
xr_kwargs.setdefault("engine", NETCDF_ENGINE)
|
|
742
739
|
xr_kwargs.setdefault("chunks", DEFAULT_CHUNKS)
|
|
743
740
|
xr_kwargs.setdefault("parallel", OPEN_IN_PARALLEL)
|
|
744
|
-
xr_kwargs.setdefault("lock", OPEN_WITH_LOCK)
|
|
745
741
|
return xr.open_mfdataset(disk_paths, **xr_kwargs)
|
pycontrails/datalib/goes.py
CHANGED
|
@@ -16,7 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import datetime
|
|
18
18
|
import enum
|
|
19
|
-
import
|
|
19
|
+
import tempfile
|
|
20
20
|
from collections.abc import Iterable
|
|
21
21
|
|
|
22
22
|
import numpy as np
|
|
@@ -535,7 +535,7 @@ class GOES:
|
|
|
535
535
|
da_dict = {}
|
|
536
536
|
for rpath, init_bytes in data.items():
|
|
537
537
|
channel = _extract_channel_from_rpath(rpath)
|
|
538
|
-
ds =
|
|
538
|
+
ds = _load_via_tempfile(init_bytes)
|
|
539
539
|
|
|
540
540
|
da = ds["CMI"]
|
|
541
541
|
da = da.expand_dims(band_id=ds["band_id"].values)
|
|
@@ -551,7 +551,7 @@ class GOES:
|
|
|
551
551
|
da = xr.concat(da_dict.values(), dim="band_id")
|
|
552
552
|
|
|
553
553
|
else:
|
|
554
|
-
ds =
|
|
554
|
+
ds = _load_via_tempfile(data)
|
|
555
555
|
da = ds["CMI"]
|
|
556
556
|
da = da.expand_dims(band_id=ds["band_id"].values)
|
|
557
557
|
|
|
@@ -564,6 +564,13 @@ class GOES:
|
|
|
564
564
|
return da
|
|
565
565
|
|
|
566
566
|
|
|
567
|
+
def _load_via_tempfile(data: bytes) -> xr.Dataset:
|
|
568
|
+
"""Load xarray dataset via temporary file."""
|
|
569
|
+
with tempfile.NamedTemporaryFile(buffering=0) as tmp:
|
|
570
|
+
tmp.write(data)
|
|
571
|
+
return xr.load_dataset(tmp.name)
|
|
572
|
+
|
|
573
|
+
|
|
567
574
|
def _concat_c02(ds1: XArrayType, ds2: XArrayType) -> XArrayType:
|
|
568
575
|
"""Concatenate two datasets with C01 and C02 data."""
|
|
569
576
|
# Average the C02 data to the C01 resolution
|
|
@@ -92,12 +92,12 @@ class CocipUncertaintyParams(CocipParams):
|
|
|
92
92
|
>>> distr = scipy.stats.uniform(loc=0.4, scale=0.2)
|
|
93
93
|
>>> params = CocipUncertaintyParams(seed=123, initial_wake_vortex_depth_uncertainty=distr)
|
|
94
94
|
>>> params.initial_wake_vortex_depth
|
|
95
|
-
0.41076420
|
|
95
|
+
np.float64(0.41076420...)
|
|
96
96
|
|
|
97
97
|
>>> # Once seeded, calling the class again gives a new value
|
|
98
98
|
>>> params = CocipUncertaintyParams(initial_wake_vortex_depth=distr)
|
|
99
99
|
>>> params.initial_wake_vortex_depth
|
|
100
|
-
0.43526372
|
|
100
|
+
np.float64(0.43526372...)
|
|
101
101
|
|
|
102
102
|
>>> # To retain the default value, set the uncertainty to None
|
|
103
103
|
>>> params = CocipUncertaintyParams(rf_lw_enhancement_factor_uncertainty=None)
|
|
@@ -212,7 +212,7 @@ class CocipUncertaintyParams(CocipParams):
|
|
|
212
212
|
|
|
213
213
|
return out
|
|
214
214
|
|
|
215
|
-
def rvs(self, size: None | int = None) -> dict[str,
|
|
215
|
+
def rvs(self, size: None | int = None) -> dict[str, np.float64 | npt.NDArray[np.float64]]:
|
|
216
216
|
"""Call each distribution's `rvs` method to generate random parameters.
|
|
217
217
|
|
|
218
218
|
Seed calls to `rvs` with class variable `rng`.
|
|
@@ -247,12 +247,12 @@ class CocipUncertaintyParams(CocipParams):
|
|
|
247
247
|
[7.9063961e-04, 3.0336906e-03, 7.7571563e-04, 2.0577813e-02,
|
|
248
248
|
9.4205803e-01, 4.3379897e-03, 3.6786550e-03, 2.4747452e-02]],
|
|
249
249
|
dtype=float32),
|
|
250
|
-
'initial_wake_vortex_depth': 0.39805019708566847,
|
|
251
|
-
'nvpm_ei_n_enhancement_factor': 0.9371878437312526,
|
|
252
|
-
'rf_lw_enhancement_factor': 1.1017491252832377,
|
|
253
|
-
'rf_sw_enhancement_factor': 0.99721639115012,
|
|
254
|
-
'sedimentation_impact_factor': 0.5071779847244678,
|
|
255
|
-
'wind_shear_enhancement_exponent': 0.34100931239701004}
|
|
250
|
+
'initial_wake_vortex_depth': np.float64(0.39805019708566847),
|
|
251
|
+
'nvpm_ei_n_enhancement_factor': np.float64(0.9371878437312526),
|
|
252
|
+
'rf_lw_enhancement_factor': np.float64(1.1017491252832377),
|
|
253
|
+
'rf_sw_enhancement_factor': np.float64(0.99721639115012),
|
|
254
|
+
'sedimentation_impact_factor': np.float64(0.5071779847244678),
|
|
255
|
+
'wind_shear_enhancement_exponent': np.float64(0.34100931239701004)}
|
|
256
256
|
"""
|
|
257
257
|
return {
|
|
258
258
|
param: distr.rvs(size=size, random_state=self.rng)
|
|
@@ -32,7 +32,6 @@ import xarray as xr
|
|
|
32
32
|
|
|
33
33
|
from pycontrails.core.met import MetDataArray, MetDataset
|
|
34
34
|
from pycontrails.core.vector import GeoVectorDataset, vector_to_lon_lat_grid
|
|
35
|
-
from pycontrails.datalib.goes import GOES, extract_goes_visualization
|
|
36
35
|
from pycontrails.models.cocip.contrail_properties import contrail_edges, plume_mass_per_distance
|
|
37
36
|
from pycontrails.models.cocip.radiative_forcing import albedo
|
|
38
37
|
from pycontrails.models.humidity_scaling import HumidityScaling
|
|
@@ -217,7 +216,7 @@ def contrail_flight_summary_statistics(flight_waypoints: GeoVectorDataset) -> pd
|
|
|
217
216
|
)
|
|
218
217
|
|
|
219
218
|
flight_waypoints["persistent_contrail_length"] = np.where(
|
|
220
|
-
np.
|
|
219
|
+
np.nan_to_num(flight_waypoints["ef"]) == 0.0, 0.0, flight_waypoints["segment_length"]
|
|
221
220
|
)
|
|
222
221
|
|
|
223
222
|
# Calculate contrail statistics for each flight
|
|
@@ -2125,6 +2124,8 @@ def compare_cocip_with_goes(
|
|
|
2125
2124
|
File path of saved CoCiP-GOES image if ``path_write_img`` is provided.
|
|
2126
2125
|
"""
|
|
2127
2126
|
|
|
2127
|
+
from pycontrails.datalib.goes import GOES, extract_goes_visualization
|
|
2128
|
+
|
|
2128
2129
|
try:
|
|
2129
2130
|
import cartopy.crs as ccrs
|
|
2130
2131
|
from cartopy.mpl.ticker import LatitudeFormatter, LongitudeFormatter
|
pycontrails/physics/geo.py
CHANGED
|
@@ -886,7 +886,7 @@ def spatial_bounding_box(
|
|
|
886
886
|
>>> lon = rng.uniform(-180, 180, size=30)
|
|
887
887
|
>>> lat = rng.uniform(-90, 90, size=30)
|
|
888
888
|
>>> spatial_bounding_box(lon, lat)
|
|
889
|
-
(-168.0, -77.0, 155.0, 82.0)
|
|
889
|
+
(np.float64(-168.0), np.float64(-77.0), np.float64(155.0), np.float64(82.0))
|
|
890
890
|
"""
|
|
891
891
|
lon_min = max(np.floor(np.min(longitude) - buffer), -180.0)
|
|
892
892
|
lon_max = min(np.ceil(np.max(longitude) + buffer), 179.99)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pycontrails
|
|
3
|
-
Version: 0.52.
|
|
3
|
+
Version: 0.52.1
|
|
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
|
|
@@ -28,7 +28,7 @@ Description-Content-Type: text/markdown
|
|
|
28
28
|
License-File: LICENSE
|
|
29
29
|
License-File: NOTICE
|
|
30
30
|
Requires-Dist: dask >=2022.3
|
|
31
|
-
Requires-Dist: numpy
|
|
31
|
+
Requires-Dist: numpy >=1.22
|
|
32
32
|
Requires-Dist: overrides >=6.1
|
|
33
33
|
Requires-Dist: pandas >=2.2
|
|
34
34
|
Requires-Dist: scipy >=1.10
|
|
@@ -70,7 +70,7 @@ Requires-Dist: cdsapi >=0.4 ; extra == 'ecmwf'
|
|
|
70
70
|
Requires-Dist: cfgrib >=0.9 ; extra == 'ecmwf'
|
|
71
71
|
Requires-Dist: eccodes >=1.4 ; extra == 'ecmwf'
|
|
72
72
|
Requires-Dist: ecmwf-api-client >=1.6 ; extra == 'ecmwf'
|
|
73
|
-
Requires-Dist: netcdf4
|
|
73
|
+
Requires-Dist: netcdf4 >=1.6.1 ; extra == 'ecmwf'
|
|
74
74
|
Requires-Dist: platformdirs >=3.0 ; extra == 'ecmwf'
|
|
75
75
|
Requires-Dist: requests >=2.25 ; extra == 'ecmwf'
|
|
76
76
|
Requires-Dist: lxml >=5.1.0 ; extra == 'ecmwf'
|
|
@@ -98,7 +98,6 @@ Requires-Dist: gcsfs >=2022.3 ; extra == 'sat'
|
|
|
98
98
|
Requires-Dist: geojson >=3.1 ; extra == 'sat'
|
|
99
99
|
Requires-Dist: google-cloud-bigquery >=3.23 ; extra == 'sat'
|
|
100
100
|
Requires-Dist: google-cloud-bigquery-storage >=2.25 ; extra == 'sat'
|
|
101
|
-
Requires-Dist: h5netcdf >=1.2 ; extra == 'sat'
|
|
102
101
|
Requires-Dist: pillow >=10.3 ; extra == 'sat'
|
|
103
102
|
Requires-Dist: pyproj >=3.5 ; extra == 'sat'
|
|
104
103
|
Requires-Dist: rasterio >=1.3 ; extra == 'sat'
|
|
@@ -121,7 +120,7 @@ Requires-Dist: zarr >=2.12 ; extra == 'zarr'
|
|
|
121
120
|
|
|
122
121
|
| | |
|
|
123
122
|
|---------------|-------------------------------------------------------------------|
|
|
124
|
-
| **Version** | [](https://pypi.python.org/pypi/pycontrails) [](https://pypi.python.org/pypi/pycontrails) |
|
|
123
|
+
| **Version** | [](https://pypi.python.org/pypi/pycontrails) [](https://anaconda.org/conda-forge/pycontrails) [](https://pypi.python.org/pypi/pycontrails) |
|
|
125
124
|
| **Citation** | [](https://zenodo.org/badge/latestdoi/617248930) |
|
|
126
125
|
| **Tests** | [](https://github.com/contrailcirrus/pycontrails/actions/workflows/test.yaml) [](https://github.com/contrailcirrus/pycontrails/actions/workflows/docs.yaml) [](https://github.com/contrailcirrus/pycontrails/actions/workflows/release.yaml) [](https://securityscorecards.dev/viewer?uri=github.com/contrailcirrus/pycontrails)|
|
|
127
126
|
| **License** | [](https://github.com/contrailcirrus/pycontrails/blob/main/LICENSE) |
|
|
@@ -140,7 +139,9 @@ Documentation and examples available at [py.contrails.org](https://py.contrails.
|
|
|
140
139
|
|
|
141
140
|
## Install
|
|
142
141
|
|
|
143
|
-
|
|
142
|
+
### Install with pip
|
|
143
|
+
|
|
144
|
+
You can install pycontrails from PyPI with `pip` (Python 3.9 or later required):
|
|
144
145
|
|
|
145
146
|
```bash
|
|
146
147
|
$ pip install pycontrails
|
|
@@ -155,7 +156,17 @@ Install the latest development version directly from GitHub:
|
|
|
155
156
|
pip install git+https://github.com/contrailcirrus/pycontrails.git
|
|
156
157
|
```
|
|
157
158
|
|
|
158
|
-
|
|
159
|
+
### Install with conda
|
|
160
|
+
|
|
161
|
+
You can install pycontrails from the [conda-forge](https://conda-forge.org/) channel with `conda` (or other `conda`-like package managers such as `mamba`):
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
conda install -c conda-forge pycontrails
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The conda-forge package includes all optional runtime dependencies.
|
|
168
|
+
|
|
169
|
+
See more installation options in the [install documentation](https://py.contrails.org/install).
|
|
159
170
|
|
|
160
171
|
## Get Involved
|
|
161
172
|
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
pycontrails/__init__.py,sha256=EpPulx2dBYpqZNsyh6HTwGGnFsvBVHBXabG5VInwSg4,2071
|
|
2
|
-
pycontrails/_version.py,sha256=
|
|
2
|
+
pycontrails/_version.py,sha256=OgPKMeVk5BhpBhwqypLdg843dA-09mBdlcfYz7wrIM8,429
|
|
3
3
|
pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
pycontrails/core/__init__.py,sha256=X0DX2FGboPN_svwN2xiBzoPpHhDtg0oKFjXQfmCqMWU,886
|
|
5
5
|
pycontrails/core/aircraft_performance.py,sha256=ikeJmdvFRDa1RdfR-JKfhQbiiIzL0c2vzcBmobmoxMs,22511
|
|
6
6
|
pycontrails/core/airports.py,sha256=nGKXN3jOtzsDCaJZVFNO3e3w-U3lqMTz5Ww5jALiRJY,6984
|
|
7
7
|
pycontrails/core/cache.py,sha256=5B8h6gqhn5Sy_pQR0wGn7QX-Cou8GdjwDUM59SRuDns,28852
|
|
8
|
-
pycontrails/core/coordinates.py,sha256=
|
|
8
|
+
pycontrails/core/coordinates.py,sha256=J5qjGuXgbLUw_U9_qREdgOaHl0ngK6Hbbjj3uw7FwNE,5565
|
|
9
9
|
pycontrails/core/fleet.py,sha256=WKF_s_gRXHmB9b1OW7RUkM1TzfvVD8Ab0Md-qKRwkzs,16544
|
|
10
|
-
pycontrails/core/flight.py,sha256=
|
|
10
|
+
pycontrails/core/flight.py,sha256=f4yD4UdKl955IXMckBx5RNSiJxDS5wkUcESYsSfARWs,85915
|
|
11
11
|
pycontrails/core/flightplan.py,sha256=cpMZ6VCYbfwh3vnew2XgVEHnqBx1NzeAhrTVCvlbbss,7569
|
|
12
12
|
pycontrails/core/fuel.py,sha256=06YUDhvC8Rx6KbUXRB9qLTsJX2V7tLbzjwAfDH0R6l8,4472
|
|
13
|
-
pycontrails/core/interpolation.py,sha256=
|
|
14
|
-
pycontrails/core/met.py,sha256=
|
|
13
|
+
pycontrails/core/interpolation.py,sha256=JY97IkHIgLRExxHN0B28R2CM5xXRYB1n4xT3gr4xPgU,26238
|
|
14
|
+
pycontrails/core/met.py,sha256=ihIP3kxat_OpgsUwVtol-esctzoaWtTCbHCFkMa3RB8,96625
|
|
15
15
|
pycontrails/core/met_var.py,sha256=JzB7UhBLQyU4TuKZqemhpBHA6Dbt89BPYO2sYBLMkL4,9504
|
|
16
16
|
pycontrails/core/models.py,sha256=VS-ct4xkojJIuqdPpT1ke1ZetNzv10nNx_Z_XalZyeo,40175
|
|
17
|
-
pycontrails/core/polygon.py,sha256=
|
|
18
|
-
pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=
|
|
19
|
-
pycontrails/core/vector.py,sha256=
|
|
17
|
+
pycontrails/core/polygon.py,sha256=F403uzql_c47MPM2Qdmec6WwtFaXZyb48h-4gK-K4EU,18577
|
|
18
|
+
pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=d9L6FxPLrxCnTJn6hcwv-iYPyk4GA7r9j2xiY7q5wzA,264704
|
|
19
|
+
pycontrails/core/vector.py,sha256=bTPDQNQnw89ZIi4IauJBkPOrNnYikBk24NppA2vx9T8,73920
|
|
20
20
|
pycontrails/datalib/__init__.py,sha256=Q2RrnjwtFzfsmJ2tEojDCzDMkd8R0MYw4mQz3YwUsqI,381
|
|
21
|
-
pycontrails/datalib/goes.py,sha256=
|
|
21
|
+
pycontrails/datalib/goes.py,sha256=UMxXXCiRL6SHY5_3cXs8GmG19eeKOOi3gKCimkyZSuc,27305
|
|
22
22
|
pycontrails/datalib/landsat.py,sha256=ptcI5d7Hk7KM-LUuZUaUxnQMwb_8z70ezTx1ErKfBhU,20212
|
|
23
23
|
pycontrails/datalib/sentinel.py,sha256=I8-NzxJenESosMUeGTt8ESiJ_kFEUSLsKdA6pZGNrEM,17734
|
|
24
24
|
pycontrails/datalib/spire.py,sha256=aW0wh5GDrszFb20ZMzmWKQ4uHbOCmHvVt9Sf4U3AyTI,26070
|
|
25
25
|
pycontrails/datalib/_leo_utils/search.py,sha256=8JzT56ps3SH1W-5rwL8BWuxLLljwxa_5fjLAuZdL_Vg,8937
|
|
26
26
|
pycontrails/datalib/_leo_utils/vis.py,sha256=qViw9OxwMN2hqG8Qpm4SV7ShyI5nTjaYkNWSptAD9Lo,1819
|
|
27
27
|
pycontrails/datalib/_leo_utils/static/bq_roi_query.sql,sha256=r_gVjpoEvCcAJP56QlXaXzgfWPZdf-kYo3D316glJLU,266
|
|
28
|
-
pycontrails/datalib/_met_utils/metsource.py,sha256=
|
|
28
|
+
pycontrails/datalib/_met_utils/metsource.py,sha256=STOFWg6WgN3SR03pOsKCXtrg-OxCf-G-N6ttqDKMe2s,24585
|
|
29
29
|
pycontrails/datalib/ecmwf/__init__.py,sha256=a3prI136k2NCxCicLMWznvr52cTx6JjHpmV6ts4OGxI,1508
|
|
30
30
|
pycontrails/datalib/ecmwf/arco_era5.py,sha256=gBQTK-pCQkwp0nsiewbnsnWjcpziekBvl1Lon27N43A,19151
|
|
31
31
|
pycontrails/datalib/ecmwf/common.py,sha256=OMCfeujF4sRxCpZl2q9ykgyg64AOBREJyU-sCO01V7g,3987
|
|
@@ -60,9 +60,9 @@ pycontrails/models/apcemm/static/apcemm_yaml_template.yaml,sha256=A3H_FWVOtqkZhG
|
|
|
60
60
|
pycontrails/models/cocip/__init__.py,sha256=miDxSFxN9PzL_ieSJb3BYeHmbKqZwGicCz1scNB5eW0,991
|
|
61
61
|
pycontrails/models/cocip/cocip.py,sha256=s9j5UhPCaaxiJZDXUvQ2KnEgvQz2pMrRHlWKZijwRIw,100140
|
|
62
62
|
pycontrails/models/cocip/cocip_params.py,sha256=T4IseK6KtY4hG3BuGZBtFgM90HCYecUXsb_QVEK6uGo,11670
|
|
63
|
-
pycontrails/models/cocip/cocip_uncertainty.py,sha256=
|
|
63
|
+
pycontrails/models/cocip/cocip_uncertainty.py,sha256=7W586BJEAY_wpSpfVdcdX-HpZG4twk3cMLhUR2ELTMA,12176
|
|
64
64
|
pycontrails/models/cocip/contrail_properties.py,sha256=u6SvucHC6VtF2kujfSVFTfv0263t5uYpNOUJZAroEzc,57111
|
|
65
|
-
pycontrails/models/cocip/output_formats.py,sha256=
|
|
65
|
+
pycontrails/models/cocip/output_formats.py,sha256=rQeSn-gnerw1LGRYpWdubCc3k_ec93_Fl1u_iXoSk-w,85491
|
|
66
66
|
pycontrails/models/cocip/radiative_forcing.py,sha256=SYmQ8lL8gpWbf6he2C9mKSjODtytbFcdnMdBM-LtBKE,46206
|
|
67
67
|
pycontrails/models/cocip/radiative_heating.py,sha256=N7FTR20luERmokprdqMOl-d8-cTYZZ2ZSsTdxZnLHfs,19368
|
|
68
68
|
pycontrails/models/cocip/unterstrasser_wake_vortex.py,sha256=Ymz-uO9vVhLIFwT9yuF5g1g3hcT-XWdryLsebSBqoVU,14976
|
|
@@ -91,7 +91,7 @@ pycontrails/models/ps_model/static/ps-aircraft-params-20240524.csv,sha256=2RtIHw
|
|
|
91
91
|
pycontrails/models/ps_model/static/ps-synonym-list-20240524.csv,sha256=MLXOeVjC5FQULGNc6rn-_BdSURJAkJLMSDzPhC7OpDY,1141
|
|
92
92
|
pycontrails/physics/__init__.py,sha256=AScCMSMSZjKxfL6mssdSLwcja1ml7MzREThQp5PLr9U,45
|
|
93
93
|
pycontrails/physics/constants.py,sha256=SWG7H7eJCvQXfUR3qS6_fYzNvEeRZga50qT2RuaHoYU,3262
|
|
94
|
-
pycontrails/physics/geo.py,sha256=
|
|
94
|
+
pycontrails/physics/geo.py,sha256=GlrGgFI26hsc04o6QLN6rY6Q1mgXuZkLXkNh1juXxuc,31277
|
|
95
95
|
pycontrails/physics/jet.py,sha256=iQ0g5cocj6j0JZPSxpTF3LLypSZGx3QQc6UyXsFfJGc,26461
|
|
96
96
|
pycontrails/physics/thermo.py,sha256=5S8QvjaGDPR5vCbDsAsvwmplJPhTeDnITjCEU_sGMRY,13240
|
|
97
97
|
pycontrails/physics/units.py,sha256=GnCJCKz25jcEYGcQVWfuYViVha6mukf08Eo4pK_3iYo,12744
|
|
@@ -101,9 +101,9 @@ pycontrails/utils/iteration.py,sha256=En2YY4NiNwCNtAVO8HL6tv9byBGKs8MKSI7R8P-gZy
|
|
|
101
101
|
pycontrails/utils/json.py,sha256=xCv71CKVZNHk4MyoYC-hl7dXObXXbI7P8gcNCn3AUoU,6172
|
|
102
102
|
pycontrails/utils/temp.py,sha256=5XXqQoEfWjz1OrhoOBZD5vkkCFeuq9LpZkyhc38gIeY,1159
|
|
103
103
|
pycontrails/utils/types.py,sha256=gNG9cSZ3djW7jufg0h1fXM3kD24sBY6ENE6wsxY_Q6o,4937
|
|
104
|
-
pycontrails-0.52.
|
|
105
|
-
pycontrails-0.52.
|
|
106
|
-
pycontrails-0.52.
|
|
107
|
-
pycontrails-0.52.
|
|
108
|
-
pycontrails-0.52.
|
|
109
|
-
pycontrails-0.52.
|
|
104
|
+
pycontrails-0.52.1.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
|
|
105
|
+
pycontrails-0.52.1.dist-info/METADATA,sha256=8Hq3tH_bn4RsRLUmaqCnordAtV5JS0gOVJmPRFesMFo,9477
|
|
106
|
+
pycontrails-0.52.1.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
|
|
107
|
+
pycontrails-0.52.1.dist-info/WHEEL,sha256=VjOakRrFjQDaJ3SL0TIqKBZGtb43B2QJnIB-eW3qItk,101
|
|
108
|
+
pycontrails-0.52.1.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
|
|
109
|
+
pycontrails-0.52.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|