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

@@ -31,7 +31,7 @@ from pycontrails.models.cocip import (
31
31
  )
32
32
  from pycontrails.models.cocip.cocip_params import CocipFlightParams
33
33
  from pycontrails.models.emissions.emissions import Emissions
34
- from pycontrails.physics import geo, thermo, units
34
+ from pycontrails.physics import constants, geo, thermo, units
35
35
 
36
36
  logger = logging.getLogger(__name__)
37
37
 
@@ -534,10 +534,11 @@ class Cocip(Model):
534
534
  self.source.size,
535
535
  )
536
536
  if not intersection.any():
537
- raise ValueError(
537
+ msg = (
538
538
  "No intersection between flight waypoints and met domain. "
539
- "Rerun Cocip with `met` overlapping flight."
539
+ "Rerun Cocip with met overlapping flight."
540
540
  )
541
+ raise ValueError(msg)
541
542
 
542
543
  # STEP 4: Begin met interpolation
543
544
  # Unfortunately we use both "u_wind" and "eastward_wind" to refer to the
@@ -1101,6 +1102,9 @@ class Cocip(Model):
1101
1102
 
1102
1103
  # Initially set energy forcing to 0 because the contrail just formed (age = 0)
1103
1104
  contrail["ef"] = np.zeros_like(contrail["n_ice_per_m"])
1105
+ if self.params["compute_atr20"]:
1106
+ contrail["global_yearly_mean_rf"] = np.zeros_like(contrail["n_ice_per_m"])
1107
+ contrail["atr20"] = np.zeros_like(contrail["n_ice_per_m"])
1104
1108
 
1105
1109
  if not self.params["filter_sac"]:
1106
1110
  contrail["sac"] = self._downwash_flight["sac"]
@@ -1226,6 +1230,10 @@ class Cocip(Model):
1226
1230
 
1227
1231
  # Perform all aggregations
1228
1232
  agg_dict = {"ef": ["sum"], "age": ["max"]}
1233
+ if self.params["compute_atr20"]:
1234
+ agg_dict["global_yearly_mean_rf"] = ["sum"]
1235
+ agg_dict["atr20"] = ["sum"]
1236
+
1229
1237
  rad_keys = ["sdr", "rsr", "olr", "rf_sw", "rf_lw", "rf_net"]
1230
1238
  for key in rad_keys:
1231
1239
  if self.params["verbose_outputs"]:
@@ -1236,6 +1244,10 @@ class Cocip(Model):
1236
1244
  aggregated = grouped.agg(agg_dict)
1237
1245
  aggregated.columns = [f"{k1}_{k2}" for k1, k2 in aggregated.columns]
1238
1246
  aggregated = aggregated.rename(columns={"ef_sum": "ef", "age_max": "contrail_age"})
1247
+ if self.params["compute_atr20"]:
1248
+ aggregated = aggregated.rename(
1249
+ columns={"global_yearly_mean_rf_sum": "global_yearly_mean_rf", "atr20_sum": "atr20"}
1250
+ )
1239
1251
 
1240
1252
  # Join the two
1241
1253
  df = df.join(aggregated)
@@ -2372,6 +2384,14 @@ def calc_timestep_contrail_evolution(
2372
2384
  contrail_2["ef"] = energy_forcing_2
2373
2385
  contrail_2["age"][energy_forcing_2 == 0.0] = np.timedelta64(0, "ns")
2374
2386
 
2387
+ if params["compute_atr20"]:
2388
+ contrail_2["global_yearly_mean_rf"] = (
2389
+ contrail_2["ef"] / constants.surface_area_earth / constants.seconds_per_year
2390
+ )
2391
+ contrail_2["atr20"] = (
2392
+ params["global_rf_to_atr20_factor"] * contrail_2["global_yearly_mean_rf"]
2393
+ )
2394
+
2375
2395
  # filter contrail_2 by persistent waypoints, if any continuous segments are left
2376
2396
  logger.debug(
2377
2397
  "Fraction of waypoints surviving: %s / %s",
@@ -2408,6 +2428,9 @@ def calc_timestep_contrail_evolution(
2408
2428
  continuous = final_contrail["continuous"]
2409
2429
  final_contrail["ef"][~continuous] = 0.0
2410
2430
  final_contrail["age"][~continuous] = np.timedelta64(0, "ns")
2431
+ if params["compute_atr20"]:
2432
+ final_contrail["global_yearly_mean_rf"][~continuous] = 0.0
2433
+ final_contrail["atr20"][~continuous] = 0.0
2411
2434
  return final_contrail
2412
2435
 
2413
2436
 
@@ -102,7 +102,7 @@ class CocipParams(ModelParams):
102
102
  met_latitude_buffer: tuple[float, float] = (10.0, 10.0)
103
103
 
104
104
  #: Met level buffer [:math:`hPa`] for Cocip initialization and evolution.
105
- met_level_buffer: tuple[float, float] = (200.0, 200.0)
105
+ met_level_buffer: tuple[float, float] = (40.0, 40.0)
106
106
 
107
107
  # ---------
108
108
  # Filtering
@@ -136,6 +136,16 @@ class CocipParams(ModelParams):
136
136
  #: :attr:`CocipGridParams.verbose_outputs_evolution`.
137
137
  verbose_outputs: bool = False
138
138
 
139
+ #: Add additional metric of ATR20 and global yearly mean RF to model output.
140
+ #: These are not standard CoCiP outputs but based on the derivation used
141
+ #: in the first supplement to :cite:`yin_predicting_2023`. ATR20 is defined
142
+ #: as the average temperature response over a 20 year horizon.
143
+ compute_atr20: bool = False
144
+
145
+ #: Constant factor used to convert global- and year-mean RF, [:math:`W m^{-2}`],
146
+ #: to ATR20, [:math:`K`], given by :cite:`yin_predicting_2023`.
147
+ global_rf_to_atr20_factor: float = 0.0151
148
+
139
149
  # ----------------
140
150
  # Model parameters
141
151
  # ----------------
@@ -1,4 +1,4 @@
1
- """Default CocipGrid parameters."""
1
+ """Default :class:`CocipGrid` parameters."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -17,7 +17,7 @@ class CocipGridParams(CocipParams):
17
17
  # Algorithm
18
18
  # ---------
19
19
 
20
- #: Approximate size of a typical `np.array` used with in CoCiP calculations.
20
+ #: Approximate size of a typical :class:`numpy.ndarray` used with in CoCiP calculations.
21
21
  #: The 4-dimensional array defining the waypoint is raveled and split into
22
22
  #: batches of this size.
23
23
  #: A smaller number for this parameter will reduce memory footprint at the
@@ -26,25 +26,27 @@ class CocipGridParams(CocipParams):
26
26
 
27
27
  #: Additional boost to target split size before SAC is computed. For typical meshes, only
28
28
  #: 10% of waypoints will survive SAC and initial downwash filtering. Accordingly, this parameter
29
- #: magnifies mesh split size before SAC is computed.
29
+ #: magnifies mesh split size before SAC is computed. See :attr:`target_split_size`.
30
30
  target_split_size_pre_SAC_boost: float = 3.0
31
31
 
32
- #: Display `tqdm` progress bar showing batch evaluation progress.
32
+ #: Display ``tqdm`` progress bar showing batch evaluation progress.
33
33
  show_progress: bool = True
34
34
 
35
35
  # ------------------
36
36
  # Simulated Aircraft
37
37
  # ------------------
38
38
 
39
- #: Nominal segment length to place at each grid point [unit `m`]. Round-off error
39
+ #: Nominal segment length to place at each grid point [:math:`m`]. Round-off error
40
40
  #: can be problematic with a small nominal segment length and a large
41
- #: `dt_integration` parameter. On the other hand, too large of a nominal segment
42
- #: length diminishes the "locality" of the grid point.
41
+ #: :attr:`dt_integration` parameter. On the other hand,
42
+ #: too large of a nominal segment length diminishes the "locality" of the grid point.
43
43
  #:
44
- #: .. versionadded 0.32.2:: EXPERIMENTAL: If None, run CoCiP in "segment-free"
45
- #: mode. This mode does not include any terms involving segments (wind shear,
46
- #: segment_length, any derived terms). See :attr:`CocipGridParams.azimuth`
47
- #: and :attr:`CocipGridParams.dsn_dz_factor` for more details.
44
+ #: .. versionadded:: 0.32.2
45
+ #:
46
+ #: EXPERIMENTAL: If None, run CoCiP in "segment-free"
47
+ #: mode. This mode does not include any terms involving segments (wind shear,
48
+ #: segment length, any derived terms). See :attr:`azimuth`
49
+ #: and :attr:`dsn_dz_factor` for more details.
48
50
  segment_length: float | None = 1000.0
49
51
 
50
52
  #: Fuel type
@@ -60,10 +62,13 @@ class CocipGridParams(CocipParams):
60
62
 
61
63
  #: Navigation bearing [:math:`\deg`] measured in clockwise direction from
62
64
  #: true north, by default 0.0.
63
- #: .. versionadded 0.32.2:: EXPERIMENTAL: If None, run CoCiP in "segment-free"
64
- #: mode. This mode does not include any terms involving segments (wind shear,
65
- #: segment_length, any derived terms), unless :attr:`CocipGridParams.dsn_dz_factor`
66
- #: is non-zero.
65
+ #:
66
+ #: .. versionadded:: 0.32.2
67
+ #:
68
+ #: EXPERIMENTAL: If None, run CoCiP in "segment-free"
69
+ #: mode. This mode does not include any terms involving segments (wind shear,
70
+ #: segment_length, any derived terms), unless :attr:`dsn_dz_factor`
71
+ #: is non-zero.
67
72
  azimuth: float | None = 0.0
68
73
 
69
74
  #: Experimental parameter used to approximate ``dsn_dz`` from ``ds_dz`` via
@@ -73,7 +78,7 @@ class CocipGridParams(CocipParams):
73
78
  #: ``dsn_dz_factor = 0.665`` adequately approximates the mean EF predictions
74
79
  #: of :class:`CocipGrid` over all azimuths.
75
80
  #:
76
- #: .. versionadded:: 0.32.2.
81
+ #: .. versionadded:: 0.32.2
77
82
  dsn_dz_factor: float = 0.0
78
83
 
79
84
  #: --------------------
@@ -90,7 +95,7 @@ class CocipGridParams(CocipParams):
90
95
  #: :attr:`aircraft_performance` model is used to estimate the aircraft mass.
91
96
  aircraft_mass: float | None = None
92
97
 
93
- #: Cruising true airspeed, [:math:`m * s^{-1}`]. If included in :attr:`CocipGrid.source`,
98
+ #: Cruising true airspeed, [:math:`m \ s^{-1}`]. If included in :attr:`CocipGrid.source`,
94
99
  #: this parameter is unused. Otherwise, if this parameter is None, the
95
100
  #: :attr:`aircraft_performance` model is used to estimate the true airspeed.
96
101
  true_airspeed: float | None = None
@@ -100,13 +105,14 @@ class CocipGridParams(CocipParams):
100
105
  #: :attr:`aircraft_performance` model is used to estimate the engine efficiency.
101
106
  engine_efficiency: float | None = None
102
107
 
103
- #: Nominal fuel flow, [:math:`kg s^{-1}`]. If included in :attr:`CocipGrid.source`,
108
+ #: Nominal fuel flow, [:math:`kg \ s^{-1}`]. If included in :attr:`CocipGrid.source`,
104
109
  #: this parameter is unused. Otherwise, if this parameter is None, the
105
110
  #: :attr:`aircraft_performance` model is used to estimate the fuel flow.
106
111
  fuel_flow: float | None = None
107
112
 
108
113
  #: Aircraft performance model. Required unless ``source`` or ``params``
109
114
  #: provide all of the following variables:
115
+ #:
110
116
  #: - wingspan
111
117
  #: - true_airspeed (or mach_number)
112
118
  #: - fuel_flow
@@ -123,7 +129,7 @@ class CocipGridParams(CocipParams):
123
129
  # ------------
124
130
 
125
131
  #: Attach additional formation specific data to the output. If True, attach
126
- #: all possible formation data. See :ref:pycontrails.models.cocipgrid.cocip_grid`
132
+ #: all possible formation data. See :mod:`pycontrails.models.cocipgrid.cocip_grid`
127
133
  #: for a list of supported formation data.
128
134
  verbose_outputs_formation: bool | set[str] = False
129
135
 
@@ -18,10 +18,16 @@ g: float = 9.80665
18
18
  #: Radius of Earth :math:`[m]`
19
19
  radius_earth: float = 6371229.0
20
20
 
21
+ #: Surface area of Earth :math:`[m^2]`
22
+ surface_area_earth: float = 5.10072e14
23
+
21
24
  #: ISA height of the tropopause :math:`[m]`
22
25
  #: :cite:`wikipediacontributorsInternationalStandardAtmosphere2023`
23
26
  h_tropopause: float = 11000.0
24
27
 
28
+ #: Seconds in a Julian year :math:`[s]`
29
+ seconds_per_year: float = 3.15576e7
30
+
25
31
  # -------------
26
32
  # Thermodynamic
27
33
  # -------------
@@ -1,4 +1,4 @@
1
- """Raise ``ModuleNotFoundError`` when dependencies are not met."""
1
+ """Raise ``ImportError`` when dependencies are not met."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -8,30 +8,32 @@ from typing import NoReturn
8
8
  def raise_module_not_found_error(
9
9
  name: str,
10
10
  package_name: str,
11
- module_not_found_error: ModuleNotFoundError,
11
+ module_not_found_error: ImportError,
12
12
  pycontrails_optional_package: str | None = None,
13
13
  extra: str | None = None,
14
14
  ) -> NoReturn:
15
- """Raise ``ModuleNotFoundError`` with a helpful message.
15
+ """Raise ``ImportError`` with a helpful message.
16
16
 
17
17
  Parameters
18
18
  ----------
19
19
  name : str
20
- The name describing the context of the ``ModuleNotFoundError``. For example,
20
+ The name describing the context of the ``ImportError``. For example,
21
21
  if the module is required for a specific function, the name could be
22
22
  "my_function function". If the module is required for a specific method,
23
23
  the name could be "MyClass.my_method method". If the module is required
24
- for an entire pycontrails module, the name could be "my_module module".
24
+ for an entire ``pycontrails`` module, the name could be "my_module module".
25
25
  package_name : str
26
26
  The name of the package that is required. This should be the full name of
27
27
  the python package, which may be different from the name of the module
28
28
  that is actually imported. For example, if ``import sklearn`` triggers
29
- the ``ModuleNotFoundError``, the ``package_name`` should be "scikit-learn".
30
- module_not_found_error : ModuleNotFoundError
31
- The ``ModuleNotFoundError`` that was raised. This is simply passed to the
32
- ``from`` clause of the ``raise`` statement below.
29
+ the ``ImportError``, the ``package_name`` should be "scikit-learn".
30
+ module_not_found_error : ImportError
31
+ The ``ImportError`` that was raised. This is passed to the
32
+ ``from`` clause of the ``raise`` statement below. The subclass of the
33
+ ``ImportError`` is preserved (e.g., ``ModuleNotFoundError`` or
34
+ ``ImportError``).
33
35
  pycontrails_optional_package : str, optional
34
- The name of the optional pycontrails package that can be used to
36
+ The name of the optional ``pycontrails`` package that can be used to
35
37
  install the required package. See the ``pyproject.toml`` file.
36
38
  extra : str, optional
37
39
  Any extra information that should be included in the error message.
@@ -61,4 +63,4 @@ def raise_module_not_found_error(
61
63
  if extra:
62
64
  msg = f"{msg} {extra}"
63
65
 
64
- raise ModuleNotFoundError(msg) from module_not_found_error
66
+ raise type(module_not_found_error)(msg) from module_not_found_error
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.49.5
3
+ Version: 0.50.0
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
@@ -47,7 +47,7 @@ Requires-Dist: platformdirs >=3.0 ; extra == 'dev'
47
47
  Requires-Dist: pre-commit >=2.10 ; extra == 'dev'
48
48
  Requires-Dist: psutil ; extra == 'dev'
49
49
  Requires-Dist: pyarrow >=5.0 ; extra == 'dev'
50
- Requires-Dist: pytest >=6.1 ; extra == 'dev'
50
+ Requires-Dist: pytest >=8.1 ; extra == 'dev'
51
51
  Requires-Dist: pytest-cov >=2.11 ; extra == 'dev'
52
52
  Requires-Dist: requests >=2.25 ; extra == 'dev'
53
53
  Requires-Dist: ruff ==0.1.15 ; extra == 'dev'
@@ -72,6 +72,7 @@ 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'
74
74
  Requires-Dist: requests >=2.25 ; extra == 'ecmwf'
75
+ Requires-Dist: lxml >=5.1.0 ; extra == 'ecmwf'
75
76
  Provides-Extra: gcp
76
77
  Requires-Dist: google-cloud-storage >=2.1 ; extra == 'gcp'
77
78
  Requires-Dist: platformdirs >=3.0 ; extra == 'gcp'
@@ -102,6 +103,7 @@ Requires-Dist: seaborn >=0.11 ; extra == 'vis'
102
103
  Requires-Dist: shapely >=2.0 ; extra == 'vis'
103
104
  Provides-Extra: zarr
104
105
  Requires-Dist: fsspec >=2022.7.1 ; extra == 'zarr'
106
+ Requires-Dist: gcsfs >=2022.7.1 ; extra == 'zarr'
105
107
  Requires-Dist: zarr >=2.12 ; extra == 'zarr'
106
108
 
107
109
  # pycontrails
@@ -1,33 +1,34 @@
1
1
  pycontrails/__init__.py,sha256=8WUs6hZAAIH1yKfwYJ8UEqNsk5voRyLmmD3Dje9DZaE,2055
2
- pycontrails/_version.py,sha256=3A20dhM8-dQpEHRAXTyDh6OEAHYxc4ZEecto-hahwxs,429
2
+ pycontrails/_version.py,sha256=b7AfuH4OcP5xNu-o3fLCv9MgMbM00aNaiiWCwRH5eV8,429
3
3
  pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  pycontrails/core/__init__.py,sha256=eNypVTz1kHBSKAJX3CgfKw-VKrMRRkKTutmjSlrfeUs,870
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=NNrFNUvmDEkeS0d1VpDNWmF225a8u2d-TGcpRgQd9Qs,28838
8
8
  pycontrails/core/coordinates.py,sha256=cb8RprpoSgRTFbAXTPNfuUHVnOxyV3zZ0Ac88P5YbBw,5465
9
- pycontrails/core/datalib.py,sha256=cf922AA0raBGWBs_UKRifvkFEDDhBJ_DmZQIdmcMZvI,23221
9
+ pycontrails/core/datalib.py,sha256=u2dNc8HxkeJd1jMPTZsOTEagTI0wQkzF1ComctmxJO8,23993
10
10
  pycontrails/core/fleet.py,sha256=WKF_s_gRXHmB9b1OW7RUkM1TzfvVD8Ab0Md-qKRwkzs,16544
11
11
  pycontrails/core/flight.py,sha256=ehxpo-Ofr4unQpeSR1ZXmbFGClyW628cA000oJZ_Jp8,77974
12
12
  pycontrails/core/flightplan.py,sha256=cpMZ6VCYbfwh3vnew2XgVEHnqBx1NzeAhrTVCvlbbss,7569
13
13
  pycontrails/core/fuel.py,sha256=06YUDhvC8Rx6KbUXRB9qLTsJX2V7tLbzjwAfDH0R6l8,4472
14
14
  pycontrails/core/interpolation.py,sha256=pDSQx8b3UjwWzKRKn_yKd3h2XsUA_ARRnZjIaH6sf60,24719
15
- pycontrails/core/met.py,sha256=DT3CAi3zucPTRgp-n_Q6CpdJ52ZwtSCFEonPIzTapWM,95120
16
- pycontrails/core/met_var.py,sha256=ZGvnYCXWnr0-A-bLmuhl1y2GIdL1X6pbzM-D-kcDpBg,9502
17
- pycontrails/core/models.py,sha256=rK7Nh5VIbNBUrJGE7Q8fnwveuuycPa-KkUJltV4SRZA,40042
15
+ pycontrails/core/met.py,sha256=0Nn03FZ43l10um5RlDQ3_gH1sHq_H59q-PpTb7xARPY,95114
16
+ pycontrails/core/met_var.py,sha256=JzB7UhBLQyU4TuKZqemhpBHA6Dbt89BPYO2sYBLMkL4,9504
17
+ pycontrails/core/models.py,sha256=VS-ct4xkojJIuqdPpT1ke1ZetNzv10nNx_Z_XalZyeo,40175
18
18
  pycontrails/core/polygon.py,sha256=ukcYh4TzGxz-ggipYe1m6DR50aEBgQhxWkEtjoTqC3w,18227
19
- pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=gIhwLXTYIQEPwKFqnutcq0NtL94c0e_LE4S-K2AXQtw,264704
20
- pycontrails/core/vector.py,sha256=QeHavtQYc44z3VFCsF_2PJTzMie7MBAkt6ReTKSLMXE,73864
19
+ pycontrails/core/rgi_cython.cp312-win_amd64.pyd,sha256=Bt9eyJQ0WMxV1-DlY4OYGLEVaRUslV_Q6zYoqRmr61E,264704
20
+ pycontrails/core/vector.py,sha256=xYZDm9VjGlZGWVGqG6u5k0fwT8Ir9U5wThreB1wKOXQ,73854
21
21
  pycontrails/datalib/__init__.py,sha256=WnXqgv20SrHZLjFZ9qpQEwRnf0QvfZU-YvMqh7PAUwg,246
22
22
  pycontrails/datalib/goes.py,sha256=Ky7elxQJyKsk6dlJ22wsOtpaZn34LaEQCqqdX3M4a5s,26932
23
- pycontrails/datalib/ecmwf/__init__.py,sha256=7-05ELdTfcX6N-yhwe-fGH4E7FlBW9Hjx5aAXPZiTpc,1151
24
- pycontrails/datalib/ecmwf/common.py,sha256=iPyY5PYIbkASPRtz-P_gD_DHcrVO5W2VqVHsucyM12M,3811
25
- pycontrails/datalib/ecmwf/era5.py,sha256=Z3097RmDd65asIPgjWQAO4HfxJj7onGyVPl1sTRMBFI,18891
23
+ pycontrails/datalib/ecmwf/__init__.py,sha256=MZBpXU2ZD4GOJX9Pr43_N-8TLF-KtV6aZQ5hADmGFCE,1262
24
+ pycontrails/datalib/ecmwf/arco_era5.py,sha256=aWI69KhTfR42mZYssXCrB43lJelcV85GC8FPZDPxMak,20835
25
+ pycontrails/datalib/ecmwf/common.py,sha256=XWPlWPQskuTMHBxWeKvRSuYWHRcKeiJAxfl5lScyTPc,3806
26
+ pycontrails/datalib/ecmwf/era5.py,sha256=r4RVTfrl_3gDwf84oo1McYOn3HBwYtD6OUrloRRq6ME,18826
26
27
  pycontrails/datalib/ecmwf/hres.py,sha256=agGc9Oope2yd0u_7nH4RuxOHkiU6dc_JvxAxdSIAoCY,28953
27
28
  pycontrails/datalib/ecmwf/ifs.py,sha256=PTdP-sRUYPAxDmAhxMDffdfUH4H3qMpTWahu4mn87GA,10877
28
- pycontrails/datalib/ecmwf/variables.py,sha256=APjW0fwQ_euK7hmxNhlujcLjx7WN1CPa9DxNZ27HsXg,8940
29
+ pycontrails/datalib/ecmwf/variables.py,sha256=gkXy3g7LOIxhp7RGGxu6MU26NAhYHpd2ewAmbmuljEo,9540
29
30
  pycontrails/datalib/gfs/__init__.py,sha256=VcE2j62ITbY7F3tEtgaLrfyjHWci-4mvLtnVg3SVgtE,712
30
- pycontrails/datalib/gfs/gfs.py,sha256=QgJ1YI9aGi75V-A4dsabvkbIZrqiZ4GUltncFaJQ6kw,22213
31
+ pycontrails/datalib/gfs/gfs.py,sha256=u8IJTXiA8Gx1CTKYPzHkopVi_BBSuUqLItTBpzmC0E8,22213
31
32
  pycontrails/datalib/gfs/variables.py,sha256=u2rAsjCJTehB6MhQj9YhlZYovdwoscqAH33T5aBDzSw,2961
32
33
  pycontrails/datalib/spire/__init__.py,sha256=YiS2SMSNU0bLHfbh41nQuKB8MnQNU8o3MldreM1nrM0,362
33
34
  pycontrails/datalib/spire/spire.py,sha256=aW0wh5GDrszFb20ZMzmWKQ4uHbOCmHvVt9Sf4U3AyTI,26070
@@ -44,8 +45,8 @@ pycontrails/models/pcr.py,sha256=G_0yR5PsCMeJBP6tZFi3M7A6Wcq8s71UvosdA7ozUkI,550
44
45
  pycontrails/models/sac.py,sha256=Cj4Hi3324wjqLQ7I2CPVkrIh2Fq5W5pKpGrwhYADoHI,16420
45
46
  pycontrails/models/tau_cirrus.py,sha256=eXt3yRrcFBaZNNeH6ZOuU4XEZU2rOfrLKEOC7f0_Ywo,5194
46
47
  pycontrails/models/cocip/__init__.py,sha256=X_MlkJzQ-henQ0xGq-1bfCMajH6s9tlK5QLnN7yfQ68,929
47
- pycontrails/models/cocip/cocip.py,sha256=nILOmLjk0DQynIkn-NVjeN1K8ufb9Xno5iyz9JTr6wI,98325
48
- pycontrails/models/cocip/cocip_params.py,sha256=xvrvUMEzE490Uxh654behS6nJ2CU1g4CzadTZId7KCc,10561
48
+ pycontrails/models/cocip/cocip.py,sha256=0nDEdSEjvWE4Klx_x2cIutjlwOmLrgWQ2bhDE65xoTE,99388
49
+ pycontrails/models/cocip/cocip_params.py,sha256=L-DAw34JgD39UV6xjRIQt2CjpIRQRqzwNxU37WjNKrw,11107
49
50
  pycontrails/models/cocip/cocip_uncertainty.py,sha256=lksROIRLt-jxEdjJTiLP9Da-FYt1GjZKaIxwDaH2Ytg,12069
50
51
  pycontrails/models/cocip/contrail_properties.py,sha256=dRq5o-YuC-s487Fs54OHpAuS8LkxM-HATNVclHKUhL0,57362
51
52
  pycontrails/models/cocip/output_formats.py,sha256=sYGYosAL6BQvntKXdeomAph-K6EKOgsI2VQynLEHxnM,79228
@@ -55,7 +56,7 @@ pycontrails/models/cocip/wake_vortex.py,sha256=d3oLkTWIocwYb99fl6t99LtEsbKkdsupA
55
56
  pycontrails/models/cocip/wind_shear.py,sha256=Dm181EsiCBJWTnRTZ3ZI3YXscBRnhA6ANnKer004b2Q,3980
56
57
  pycontrails/models/cocipgrid/__init__.py,sha256=OYSdZ1Htbr_IP7N_HuOAj1Pa_KLHtdEeJfXP-cN-gnU,271
57
58
  pycontrails/models/cocipgrid/cocip_grid.py,sha256=mcz8_G4YyiyqkuAAZiwWZk-NOtcxKJY57pVkhSunHSQ,92278
58
- pycontrails/models/cocipgrid/cocip_grid_params.py,sha256=I-Ua1ifeqOx12SbbFwau2s17LjemvUZ6ihJhmJIqpdA,5911
59
+ pycontrails/models/cocipgrid/cocip_grid_params.py,sha256=ZpN00VEmeRYaeZhvSfVjnEjrgn6XdClf1eqJC8Ytcuw,6013
59
60
  pycontrails/models/emissions/__init__.py,sha256=BXzV2pBps8j3xbaF1n9uPdVVLI5MBIGYx8xqDJezYIE,499
60
61
  pycontrails/models/emissions/black_carbon.py,sha256=9DRqB487pH8Iq83FXggA5mPLYEAA8NpsKx24f8uTEF4,20828
61
62
  pycontrails/models/emissions/emissions.py,sha256=WYypixqzR9a1wqfevxEKIrk3NIAIp0fKBMqOHkawsWo,48917
@@ -73,20 +74,20 @@ pycontrails/models/ps_model/ps_model.py,sha256=j7-37E3S_qu3xZGkVJZEBXxQoJ-QKXIub
73
74
  pycontrails/models/ps_model/ps_operational_limits.py,sha256=-2qwQBRr1qHUALSIEGdQM7bxi47BeJpU744epVyy1jI,10701
74
75
  pycontrails/models/ps_model/static/ps-aircraft-params-20240209.csv,sha256=rPp6Ews2dKEWHP0i3II0-y7w95ZyVsXtWwIYcm3BsPE,14742
75
76
  pycontrails/physics/__init__.py,sha256=AScCMSMSZjKxfL6mssdSLwcja1ml7MzREThQp5PLr9U,45
76
- pycontrails/physics/constants.py,sha256=JdlUyfxAgrMsF8VFNobe1Q7BXBghLu19QKQkX6vgLHQ,3100
77
+ pycontrails/physics/constants.py,sha256=SWG7H7eJCvQXfUR3qS6_fYzNvEeRZga50qT2RuaHoYU,3262
77
78
  pycontrails/physics/geo.py,sha256=Dwc9dUzUlHGCDVqFdh492vJZsC5CB8J45cJnsHaMRF4,31229
78
79
  pycontrails/physics/jet.py,sha256=iQ0g5cocj6j0JZPSxpTF3LLypSZGx3QQc6UyXsFfJGc,26461
79
80
  pycontrails/physics/thermo.py,sha256=mwtsee1nzlIP6OUdPPMrlrLTHoWqhdm6Qxdb9xS50R0,13261
80
81
  pycontrails/physics/units.py,sha256=rDHeF1r27wYtzrbU0OjZVsIKa4REvFekNjOrILGkEPw,12728
81
82
  pycontrails/utils/__init__.py,sha256=VmklFC-5I5lGFQEzuomlPk_bM6CoM9XDljfjCovG3vw,33
82
- pycontrails/utils/dependencies.py,sha256=oJDnykg1WtMWn1wSE2OKC6czj2hGD1Irh3zrI5g160I,2552
83
+ pycontrails/utils/dependencies.py,sha256=SjEdbDDKfGmmYResWZndMCUySO0W0ptWAeY1aA_kcx8,2625
83
84
  pycontrails/utils/iteration.py,sha256=En2YY4NiNwCNtAVO8HL6tv9byBGKs8MKSI7R8P-gZy4,332
84
85
  pycontrails/utils/json.py,sha256=xCv71CKVZNHk4MyoYC-hl7dXObXXbI7P8gcNCn3AUoU,6172
85
86
  pycontrails/utils/temp.py,sha256=5XXqQoEfWjz1OrhoOBZD5vkkCFeuq9LpZkyhc38gIeY,1159
86
87
  pycontrails/utils/types.py,sha256=f8FNSSzW-1ISgJ0zDtCwZgpuzpt26sUABiHHusS414s,4725
87
- pycontrails-0.49.5.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
88
- pycontrails-0.49.5.dist-info/METADATA,sha256=VPxASRleJeBK3MiyIOnXN3lCJf27w7uDA88ALwA_7R8,8429
89
- pycontrails-0.49.5.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
90
- pycontrails-0.49.5.dist-info/WHEEL,sha256=j9Aissza3750LQHFAQyYerNjmkEON1-8w_RaZNFtKSs,102
91
- pycontrails-0.49.5.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
92
- pycontrails-0.49.5.dist-info/RECORD,,
88
+ pycontrails-0.50.0.dist-info/LICENSE,sha256=HVr8JnZfTaA-12BfKUQZi5hdrB3awOwLWs5X_ga5QzA,10353
89
+ pycontrails-0.50.0.dist-info/METADATA,sha256=AEbrq0M0Zhb8ttYIrKZnhxUdo_3OYubbVuzmFHAGEf0,8528
90
+ pycontrails-0.50.0.dist-info/NOTICE,sha256=qYeNEp8OjDK5jSW3hTlr9LQRjZeEhXQm0zDei5UFaYs,1969
91
+ pycontrails-0.50.0.dist-info/WHEEL,sha256=fZWyj_84lK0cA-ZNCsdwhbJl0OTrpWkxInEn424qrSs,102
92
+ pycontrails-0.50.0.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
93
+ pycontrails-0.50.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp312-cp312-win_amd64
5
5