pycontrails 0.47.3__cp311-cp311-macosx_11_0_arm64.whl → 0.48.1__cp311-cp311-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,7 +9,7 @@ import numpy as np
9
9
 
10
10
  import pycontrails
11
11
  from pycontrails.core.flight import Flight
12
- from pycontrails.core.met import MetDataArray, MetDataset
12
+ from pycontrails.core.met import MetDataset
13
13
  from pycontrails.core.met_var import AirTemperature, SpecificHumidity
14
14
  from pycontrails.core.models import Model, ModelParams
15
15
  from pycontrails.core.vector import GeoVectorDataset
@@ -56,12 +56,14 @@ class ISSR(Model):
56
56
  >>> # Instantiate and run model
57
57
  >>> scaling = ConstantHumidityScaling(rhi_adj=0.98)
58
58
  >>> model = ISSR(met, humidity_scaling=scaling)
59
- >>> issr = model.eval()
60
- >>> issr.proportion # Get proportion of values with ice supersaturation
61
- 0.114140917963
59
+ >>> out1 = model.eval()
60
+ >>> issr1 = out1["issr"]
61
+ >>> issr1.proportion # Get proportion of values with ice supersaturation
62
+ 0.114140
62
63
 
63
64
  >>> # Run with a lower threshold
64
- >>> issr2 = ISSR(met, rhi_threshold=0.95, humidity_scaling=scaling).eval()
65
+ >>> out2 = model.eval(rhi_threshold=0.95)
66
+ >>> issr2 = out2["issr"]
65
67
  >>> issr2.proportion
66
68
  0.146647
67
69
  """
@@ -78,11 +80,11 @@ class ISSR(Model):
78
80
  def eval(self, source: GeoVectorDataset, **params: Any) -> GeoVectorDataset: ...
79
81
 
80
82
  @overload
81
- def eval(self, source: MetDataset | None = ..., **params: Any) -> MetDataArray: ...
83
+ def eval(self, source: MetDataset | None = ..., **params: Any) -> MetDataset: ...
82
84
 
83
85
  def eval(
84
86
  self, source: GeoVectorDataset | Flight | MetDataset | None = None, **params: Any
85
- ) -> GeoVectorDataset | Flight | MetDataArray:
87
+ ) -> GeoVectorDataset | Flight | MetDataset:
86
88
  """Evaluate ice super-saturated regions along flight trajectory or on meteorology grid.
87
89
 
88
90
  .. versionchanged:: 0.27.0
@@ -90,6 +92,12 @@ class ISSR(Model):
90
92
  Humidity scaling now handled automatically. This is controlled by
91
93
  model parameter ``humidity_scaling``.
92
94
 
95
+ .. versionchanged:: 0.48.0
96
+
97
+ If the ``source`` is a :class:`MetDataset`, the returned object will
98
+ also be a :class:`MetDataset`. Previous the "issr" :class:`MetDataArray`
99
+ was returned.
100
+
93
101
  Parameters
94
102
  ----------
95
103
  source : GeoVectorDataset | Flight | MetDataset | None, optional
@@ -100,7 +108,7 @@ class ISSR(Model):
100
108
 
101
109
  Returns
102
110
  -------
103
- GeoVectorDataset | Flight | MetDataArray
111
+ GeoVectorDataset | Flight | MetDataset
104
112
  Returns 1 in ISSR, 0 everywhere else.
105
113
  Returns `np.nan` if interpolating outside meteorology grid.
106
114
 
@@ -117,40 +125,30 @@ class ISSR(Model):
117
125
  self.downselect_met()
118
126
  self.source.setdefault("air_pressure", self.source.air_pressure)
119
127
 
120
- scale_humidity = (self.params["humidity_scaling"] is not None) and (
121
- "specific_humidity" not in self.source
122
- )
128
+ humidity_scaling = self.params["humidity_scaling"]
129
+ scale_humidity = humidity_scaling is not None and "specific_humidity" not in self.source
130
+
123
131
  self.set_source_met()
124
132
 
125
133
  # apply humidity scaling, warn if no scaling is provided for ECMWF data
126
134
  if scale_humidity:
127
- self.params["humidity_scaling"].eval(self.source, copy_source=False)
135
+ humidity_scaling.eval(self.source, copy_source=False)
128
136
 
129
- issr_ = issr(
137
+ self.source["issr"] = issr(
130
138
  air_temperature=self.source.data["air_temperature"],
131
139
  specific_humidity=self.source.data["specific_humidity"],
132
140
  air_pressure=self.source.data["air_pressure"],
133
141
  rhi=self.source.data.get("rhi", None), # if rhi already known, pass it in
134
142
  rhi_threshold=self.params["rhi_threshold"],
135
143
  )
136
- self.source["issr"] = issr_
137
-
138
- # Tag output with additional attrs when source is MetDataset
139
- if isinstance(self.source, MetDataset):
140
- attrs: dict[str, Any] = {
141
- "description": self.long_name,
142
- "pycontrails_version": pycontrails.__version__,
143
- }
144
- if scale_humidity:
145
- for k, v in self.params["humidity_scaling"].description.items():
146
- attrs[f"humidity_scaling_{k}"] = v
147
- if self.met is not None:
148
- attrs["met_source"] = self.met.attrs.get("met_source", "unknown")
149
-
150
- self.source["issr"].data.attrs.update(attrs)
151
- return self.source["issr"]
152
-
153
- # In GeoVectorDataset case, return source
144
+
145
+ # Tag output with additional metadata attrs
146
+ self.transfer_met_source_attrs()
147
+ self.source.attrs["pycontrails_version"] = pycontrails.__version__
148
+ if scale_humidity:
149
+ for k, v in humidity_scaling.description.items():
150
+ self.source.attrs[f"humidity_scaling_{k}"] = v
151
+
154
152
  return self.source
155
153
 
156
154
 
pycontrails/models/pcr.py CHANGED
@@ -12,7 +12,7 @@ from typing import Any, overload
12
12
  import numpy as np
13
13
 
14
14
  from pycontrails.core.flight import Flight
15
- from pycontrails.core.met import MetDataArray, MetDataset
15
+ from pycontrails.core.met import MetDataset
16
16
  from pycontrails.core.met_var import AirTemperature, SpecificHumidity
17
17
  from pycontrails.core.models import Model
18
18
  from pycontrails.core.vector import GeoVectorDataset
@@ -56,11 +56,11 @@ class PCR(Model):
56
56
  def eval(self, source: GeoVectorDataset, **params: Any) -> GeoVectorDataset: ...
57
57
 
58
58
  @overload
59
- def eval(self, source: MetDataset | None = ..., **params: Any) -> MetDataArray: ...
59
+ def eval(self, source: MetDataset | None = ..., **params: Any) -> MetDataset: ...
60
60
 
61
61
  def eval(
62
62
  self, source: GeoVectorDataset | Flight | MetDataset | None = None, **params: Any
63
- ) -> GeoVectorDataset | Flight | MetDataArray:
63
+ ) -> GeoVectorDataset | Flight | MetDataset:
64
64
  """Evaluate potential contrails regions of the :attr:`met` grid.
65
65
 
66
66
  Parameters
@@ -71,7 +71,7 @@ class PCR(Model):
71
71
 
72
72
  Returns
73
73
  -------
74
- GeoVectorDataset | Flight | MetDataArray
74
+ GeoVectorDataset | Flight | MetDataset
75
75
  Returns 1 in potential contrail regions, 0 everywhere else.
76
76
  Returns ``np.nan`` if interpolating outside meteorology grid.
77
77
  **params : Any
@@ -96,14 +96,7 @@ class PCR(Model):
96
96
 
97
97
  pcr_ = _pcr_from_issr_and_sac(self.source.data["issr"], self.source.data["sac"])
98
98
  self.source["pcr"] = pcr_
99
- # Tag output with additional attrs when source is MetDataset
100
- if isinstance(self.source, MetDataset):
101
- attrs = {**self.source["issr"].attrs, **self.source["sac"].attrs}
102
- attrs["description"] = self.long_name
103
- self.source["pcr"].attrs.update(attrs)
104
- return self.source["pcr"]
105
-
106
- # In GeoVectorDataset case, return source
99
+
107
100
  return self.source
108
101
 
109
102
 
pycontrails/models/sac.py CHANGED
@@ -11,7 +11,7 @@ import scipy.optimize
11
11
  import pycontrails
12
12
  from pycontrails.core.flight import Flight
13
13
  from pycontrails.core.fuel import Fuel, JetA
14
- from pycontrails.core.met import MetDataArray, MetDataset
14
+ from pycontrails.core.met import MetDataset
15
15
  from pycontrails.core.met_var import AirTemperature, SpecificHumidity
16
16
  from pycontrails.core.models import Model, ModelParams
17
17
  from pycontrails.core.vector import GeoVectorDataset
@@ -64,11 +64,11 @@ class SAC(Model):
64
64
  def eval(self, source: GeoVectorDataset, **params: Any) -> GeoVectorDataset: ...
65
65
 
66
66
  @overload
67
- def eval(self, source: MetDataset | None = ..., **params: Any) -> MetDataArray: ...
67
+ def eval(self, source: MetDataset | None = ..., **params: Any) -> MetDataset: ...
68
68
 
69
69
  def eval(
70
70
  self, source: GeoVectorDataset | Flight | MetDataset | None = None, **params: Any
71
- ) -> GeoVectorDataset | Flight | MetDataArray:
71
+ ) -> GeoVectorDataset | Flight | MetDataset:
72
72
  """Evaluate the Schmidt-Appleman criteria along flight trajectory or on meteorology grid.
73
73
 
74
74
  .. versionchanged:: 0.27.0
@@ -76,6 +76,12 @@ class SAC(Model):
76
76
  Humidity scaling now handled automatically. This is controlled by
77
77
  model parameter ``humidity_scaling``.
78
78
 
79
+ .. versionchanged:: 0.48.0
80
+
81
+ If the ``source`` is a :class:`MetDataset`, the returned object will
82
+ also be a :class:`MetDataset`. Previous the "sac" :class:`MetDataArray`
83
+ was returned.
84
+
79
85
  Parameters
80
86
  ----------
81
87
  source : GeoVectorDataset | Flight | MetDataset | None, optional
@@ -86,7 +92,7 @@ class SAC(Model):
86
92
 
87
93
  Returns
88
94
  -------
89
- GeoVectorDataset | Flight | MetDataArray
95
+ GeoVectorDataset | Flight | MetDataset
90
96
  Returns 1 where SAC is satisfied, 0 everywhere else.
91
97
  Returns `np.nan` if interpolating outside meteorology grid.
92
98
 
@@ -104,14 +110,13 @@ class SAC(Model):
104
110
  self.downselect_met()
105
111
  self.source.setdefault("air_pressure", self.source.air_pressure)
106
112
 
107
- scale_humidity = (self.params["humidity_scaling"] is not None) and (
108
- "specific_humidity" not in self.source
109
- )
113
+ humidity_scaling = self.params["humidity_scaling"]
114
+ scale_humidity = humidity_scaling is not None and "specific_humidity" not in self.source
110
115
  self.set_source_met()
111
116
 
112
117
  # apply humidity scaling, warn if no scaling is provided for ECMWF data
113
118
  if scale_humidity:
114
- self.params["humidity_scaling"].eval(self.source, copy_source=False)
119
+ humidity_scaling.eval(self.source, copy_source=False)
115
120
 
116
121
  # Extract source data
117
122
  air_temperature = self.source.data["air_temperature"]
@@ -123,7 +128,8 @@ class SAC(Model):
123
128
  if isinstance(self.source, Flight):
124
129
  fuel = self.source.fuel
125
130
  else:
126
- fuel = self.get_source_param("fuel")
131
+ # NOTE: Not setting fuel on MetDataset source
132
+ fuel = self.get_source_param("fuel", set_attr=False)
127
133
  assert isinstance(fuel, Fuel), "The fuel attribute must be of type Fuel"
128
134
 
129
135
  ei_h2o = fuel.ei_h2o
@@ -142,24 +148,15 @@ class SAC(Model):
142
148
  self.source["rh_critical_sac"] = rh_crit_sac
143
149
  self.source["sac"] = sac_
144
150
 
145
- # Tag output with additional attrs when source is MetDataset
146
- if isinstance(self.source, MetDataset):
147
- attrs: dict[str, Any] = {
148
- "description": self.long_name,
149
- "pycontrails_version": pycontrails.__version__,
150
- }
151
- if scale_humidity:
152
- for k, v in self.params["humidity_scaling"].description.items():
153
- attrs[f"humidity_scaling_{k}"] = v
154
- if self.met is not None:
155
- attrs["met_source"] = self.met.attrs.get("met_source", "unknown")
156
- if isinstance(engine_efficiency, (int, float)):
157
- attrs["engine_efficiency"] = engine_efficiency
158
-
159
- self.source["sac"].data.attrs.update(attrs)
160
- return self.source["sac"]
161
-
162
- # In GeoVectorDataset case, return source
151
+ # Tag output with additional metadata attrs
152
+ self.transfer_met_source_attrs()
153
+ self.source.attrs["pycontrails_version"] = pycontrails.__version__
154
+ if scale_humidity:
155
+ for k, v in humidity_scaling.description.items():
156
+ self.source.attrs[f"humidity_scaling_{k}"] = v
157
+ if isinstance(engine_efficiency, (int, float)):
158
+ self.source.attrs["engine_efficiency"] = engine_efficiency
159
+
163
160
  return self.source
164
161
 
165
162
 
@@ -16,6 +16,27 @@ TauCirrus = MetVariable(
16
16
  )
17
17
 
18
18
 
19
+ def _geopotential_height(met: MetDataset) -> xr.DataArray:
20
+ """Extract geopotential height from MetDataset."""
21
+
22
+ # Attempt 1: Use geopotential height if available
23
+ try:
24
+ return met.data["geopotential_height"]
25
+ except KeyError:
26
+ pass
27
+
28
+ # Attempt 2: Use geopotential if available
29
+ try:
30
+ return met.data["geopotential"] / constants.g
31
+ except KeyError:
32
+ pass
33
+
34
+ # Attempt 3: Approximate geopotential height from altitude
35
+ # https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.height_to_geopotential.html
36
+ altitude = met.data["altitude"]
37
+ return altitude * constants.radius_earth / (constants.radius_earth + altitude)
38
+
39
+
19
40
  def tau_cirrus(met: MetDataset) -> xr.DataArray:
20
41
  """Calculate the optical depth of NWP cirrus around each pressure level.
21
42
 
@@ -25,7 +46,6 @@ def tau_cirrus(met: MetDataset) -> xr.DataArray:
25
46
  A MetDataset with the following variables:
26
47
  - "air_temperature"
27
48
  - "specific_cloud_ice_water_content" or "ice_water_mixing_ratio"
28
- - "geopotential_height" or "geopotential"
29
49
 
30
50
  Returns
31
51
  -------
@@ -41,10 +61,7 @@ def tau_cirrus(met: MetDataset) -> xr.DataArray:
41
61
  of the derivative.
42
62
  """
43
63
 
44
- try:
45
- geopotential_height = met.data["geopotential_height"]
46
- except KeyError:
47
- geopotential_height = met.data["geopotential"] / constants.g
64
+ geopotential_height = _geopotential_height(met)
48
65
 
49
66
  # TODO: these are not *quite* the same, though we treat them the same for now
50
67
  # ECMWF "specific_cloud_ice_water_content" is mass ice per mass of *moist* air
@@ -29,7 +29,7 @@ ArrayScalarLike = TypeVar(
29
29
  )
30
30
 
31
31
  #: Datetime like input (datetime, pd.Timestamp, np.datetime64)
32
- DatetimeLike = TypeVar("DatetimeLike", datetime, pd.Timestamp, np.datetime64)
32
+ DatetimeLike = TypeVar("DatetimeLike", datetime, pd.Timestamp, np.datetime64, str)
33
33
 
34
34
 
35
35
  def support_arraylike(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pycontrails
3
- Version: 0.47.3
3
+ Version: 0.48.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
@@ -68,7 +68,6 @@ Provides-Extra: ecmwf
68
68
  Requires-Dist: cdsapi >=0.4 ; extra == 'ecmwf'
69
69
  Requires-Dist: cfgrib >=0.9 ; extra == 'ecmwf'
70
70
  Requires-Dist: eccodes >=1.4 ; extra == 'ecmwf'
71
- Requires-Dist: ecmwflibs >=0.4 ; extra == 'ecmwf'
72
71
  Requires-Dist: ecmwf-api-client >=1.6 ; extra == 'ecmwf'
73
72
  Requires-Dist: netcdf4 >=1.6.1 ; extra == 'ecmwf'
74
73
  Requires-Dist: platformdirs >=3.0 ; extra == 'ecmwf'
@@ -87,6 +86,7 @@ Provides-Extra: goes
87
86
  Requires-Dist: cartopy >=0.22 ; extra == 'goes'
88
87
  Requires-Dist: gcsfs >=2022.3 ; extra == 'goes'
89
88
  Requires-Dist: h5netcdf >=1.2 ; extra == 'goes'
89
+ Requires-Dist: aiohttp >=3.9.0b0 ; (python_version >= "3.12") and extra == 'goes'
90
90
  Provides-Extra: jupyter
91
91
  Requires-Dist: ipywidgets >=7.6 ; extra == 'jupyter'
92
92
  Requires-Dist: jupyterlab >=2.2 ; extra == 'jupyter'
@@ -1,38 +1,38 @@
1
- pycontrails-0.47.3.dist-info/RECORD,,
2
- pycontrails-0.47.3.dist-info/LICENSE,sha256=gJ-h7SFFD1mCfR6a7HILvEtodDT6Iig8bLXdgqR6ucA,10175
3
- pycontrails-0.47.3.dist-info/WHEEL,sha256=eaDTbMedWofVq8IZjew9qeAkoA5Sw2MOU2ppdIRr1Jg,110
4
- pycontrails-0.47.3.dist-info/NOTICE,sha256=gKI8DcN1WhiXB2SFRKDogcjONldGubTvBxiOYdC4CXU,1926
5
- pycontrails-0.47.3.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
6
- pycontrails-0.47.3.dist-info/METADATA,sha256=iaCOZze4xO5_ybVLLge25rWnUSO6pkMOG-pQKj2am2A,8391
7
- pycontrails/_version.py,sha256=qqnDrZB1EC8teGOBVANzHbFsAEVIn95eyJSqP3H52AU,413
8
- pycontrails/__init__.py,sha256=taA3bH-g7TcepRc88uS3ROyxi4O1hxXb3xat-gY1-m4,1963
1
+ pycontrails-0.48.1.dist-info/RECORD,,
2
+ pycontrails-0.48.1.dist-info/LICENSE,sha256=gJ-h7SFFD1mCfR6a7HILvEtodDT6Iig8bLXdgqR6ucA,10175
3
+ pycontrails-0.48.1.dist-info/WHEEL,sha256=2nXsVu36abDiNGsH9Fliml6zEeomzRt7eNy1CE_Eupc,110
4
+ pycontrails-0.48.1.dist-info/NOTICE,sha256=gKI8DcN1WhiXB2SFRKDogcjONldGubTvBxiOYdC4CXU,1926
5
+ pycontrails-0.48.1.dist-info/top_level.txt,sha256=Z8J1R_AiBAyCVjNw6jYLdrA68PrQqTg0t3_Yek_IZ0Q,29
6
+ pycontrails-0.48.1.dist-info/METADATA,sha256=-DmCMG3RmYaxq1sX_lfwfKAv8gV7naDqpKTadgpTCcI,8423
7
+ pycontrails/_version.py,sha256=SmV-QgndmfqQSl3EnRtXH5ks2pvcWLjNDwIDauQbrGk,413
8
+ pycontrails/__init__.py,sha256=jQlqY1c5d9cKwN5ItqaQdJdhAWnQbHIk4TX6QI-CYww,1962
9
9
  pycontrails/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- pycontrails/core/rgi_cython.cpython-311-darwin.so,sha256=tu6lUVv5lpi7Qbho6D8881KH646rm3Zny8MjTAB2FA0,316269
11
- pycontrails/core/vector.py,sha256=kICxXhgsSAi64R99_SYlzGuQQnjexa5Slv464YGB5kM,63979
12
- pycontrails/core/models.py,sha256=PJI86kj4cMfEZ6VZ87mvohx0YTRgTOEImGWxxecWCws,37533
10
+ pycontrails/core/rgi_cython.cpython-311-darwin.so,sha256=xLdjU0utSeBmWGbDPVbgJkBdHL1VJz9dTi27O7ILX-Y,316269
11
+ pycontrails/core/vector.py,sha256=dHWUnsJasIHldRUtHy00zhONJH1pV8fgJ6sKJHIJrNk,70400
12
+ pycontrails/core/models.py,sha256=MtaujNXbUd0fWINWPqCIqOoWD6jv_sU649D7COavHpc,38306
13
13
  pycontrails/core/interpolation.py,sha256=C275gTrX-GJWfMm6gd2LiD-fKSHmMmDFrq--Pn5w_x4,23703
14
14
  pycontrails/core/fleet.py,sha256=Zxp23KPV2yugiY210wOLelI66HJLrjEDYa2y8JP1CmY,13278
15
- pycontrails/core/flight.py,sha256=vUMHyi6ysC9mx51s3AAdRY94nZYvKUjowKhQlPL8gF0,71261
15
+ pycontrails/core/flight.py,sha256=QJCbVvY5P0JncjfxOHMme1uU3SPXAbs8hXHSRJKJCM4,71895
16
16
  pycontrails/core/fuel.py,sha256=u6u12Hatq81yvCF1Y1hEEu-Bp-cMi-Vsl7-5jTGXUks,4050
17
17
  pycontrails/core/polygon.py,sha256=RfiurNFrJWcJZuqIHRFCUncQEwIg0hutQrW9RLJVMY8,17315
18
- pycontrails/core/datalib.py,sha256=M7XxjGyJ3MkbL7WMX_Ph5QSLe1QQb-8VvAZbb3e6hRc,21715
18
+ pycontrails/core/datalib.py,sha256=L_n0ns2Yspy2NswBJ5fIa5x8vJKdBxknsdWTYL14Jew,22495
19
19
  pycontrails/core/cache.py,sha256=FvE50YK8dddydozpQHe-XxE1tj8xT5SWcb2LtLj-dC0,28453
20
20
  pycontrails/core/__init__.py,sha256=4ZE7x1gMa_Q7GcgcWpPP9fQ-sTulCXWmMjsCJ0odakY,840
21
21
  pycontrails/core/flightplan.py,sha256=7BwYPPo4QfqCIWzBwXD848xg34Ggza4ldi4VUogWVYQ,7643
22
- pycontrails/core/met.py,sha256=UAGlRE5VLfT4uc4Ellw7BAQoYGGNJGsoxVVv_-2A4fc,84984
22
+ pycontrails/core/met.py,sha256=q1ZyinJ5pzin111ALRqruJV8b1TfoLKq5C5MZTrGDJc,89239
23
23
  pycontrails/core/aircraft_performance.py,sha256=8Ig0vWMIe_EDOK4KUhOlzzjkmbvpXz6z0_0f_xZCacI,22149
24
24
  pycontrails/core/airports.py,sha256=5D0VF9DxleQlVOmMW-P8_fVVkob-aB3doO1Co2XNFss,6766
25
- pycontrails/core/met_var.py,sha256=a6LBiX_W04q1xWNumYmDiSbZftfbtP9FPJl2jLpmZGs,9193
26
- pycontrails/core/coordinates.py,sha256=b7D2lknnnwh8rBSla9M3ojqRYiASAOrVv0OAFD8xpDw,5078
25
+ pycontrails/core/met_var.py,sha256=zyXWI_9dRS4FfH1Io_k0YcIxZIsp8y4YPiC_Oayi_gs,9195
26
+ pycontrails/core/coordinates.py,sha256=ALGzFXjr4poFsqflg8D0kzUTC5bBjsVcXwiHfEsw7vs,5098
27
27
  pycontrails/datalib/goes.py,sha256=2JQ8C3iUtSl6hDjVivv4VB3oCRXxuT3ciB0OCFF2lIE,26150
28
28
  pycontrails/datalib/__init__.py,sha256=s5b8W6scXgespKZjPcaC-8jyLd3FqZqN0BZccLxaGuE,237
29
- pycontrails/datalib/ecmwf/era5.py,sha256=_SLdr6WsH9RaAgflwPnYaYvK8N36uWmmjiC8AX0QhoY,18612
30
- pycontrails/datalib/ecmwf/hres.py,sha256=vPKGHU1ePe1KdDjvNdiY6qJ-7NOBJ_-HpizGNujAlxA,29844
29
+ pycontrails/datalib/ecmwf/era5.py,sha256=OteEGx3oGrYeqHwtZc-3JtJz1Bz0dzh6uT4GHEQfabM,18318
30
+ pycontrails/datalib/ecmwf/hres.py,sha256=lGp75SmS4GfLkppj7LiCcU1OXNA0_cP5mbun-AkdMok,28187
31
31
  pycontrails/datalib/ecmwf/variables.py,sha256=akqjUS3WKnSzV1Y0KkHLylH7QByvitc3wo8NBFeSNew,8714
32
32
  pycontrails/datalib/ecmwf/__init__.py,sha256=F9a-iRz27nmVuQpMUwx5hjSCW95KnRmsHsa7m1_T86Y,1108
33
- pycontrails/datalib/ecmwf/common.py,sha256=PutZoa3cmY8CZ8T4vCArx4xHLOYWwJt_L06cHs0NssU,5671
34
- pycontrails/datalib/ecmwf/ifs.py,sha256=ldffFiM7cDZGe5Llc4IHLFqy5sSZJrmCpJspbt_Rnj4,10404
35
- pycontrails/datalib/gfs/gfs.py,sha256=hIpMX2GBX3y3SXyodwDN3u-vx0mK9Ig7FTWOtWyy_yA,23236
33
+ pycontrails/datalib/ecmwf/common.py,sha256=UMlmsGn_54RNNRezwRbqP9zqiBPHhYp-gBHDCn-9Ofc,3549
34
+ pycontrails/datalib/ecmwf/ifs.py,sha256=t8MAZNGIe02T19A7ggeXUpxBiYjm-VPoeneoaRVtjBw,10594
35
+ pycontrails/datalib/gfs/gfs.py,sha256=PL1ExmhKK3eKwQ4HZgdXMFKRidpg-JBDQuaSPfZeXn4,21571
36
36
  pycontrails/datalib/gfs/variables.py,sha256=s6rKyFdDA8E0Jz8X4twM7mgq5zhRGlk5qTedItyqoY8,2860
37
37
  pycontrails/datalib/gfs/__init__.py,sha256=tWxgqmlW8Uo07J-3fBTXPrteatzTka9mSXomhWy3NVA,684
38
38
  pycontrails/datalib/spire/spire.py,sha256=dmtynQjeAk1b-3mgdPGEyon770oBcEm-_jLBoaBDiH8,25321
@@ -43,18 +43,18 @@ pycontrails/ext/empirical_grid.py,sha256=pAa-YvbP0OCnE--2WvPbqhQo8B6NWeSFGgcFXsY
43
43
  pycontrails/ext/bada.py,sha256=j4Tj7oWSV_6UxYYa9_OjC1yTVzJMQdNRDI4aUQam_xM,1063
44
44
  pycontrails/utils/iteration.py,sha256=UjMn2FRDyC0A7q_MqKNpqqeNZm-lA23Ws-KV7zFzAl4,292
45
45
  pycontrails/utils/__init__.py,sha256=Gt_57sBgfliFSxx9sDpuchykFDxmM11Wg9xAeSqPcnI,32
46
- pycontrails/utils/types.py,sha256=lWte6uf_nnmxJPqNK3n9Ve8AK_8TLorbX0f3DLCw3ZM,4564
46
+ pycontrails/utils/types.py,sha256=UuPBCLeXCGYCde5q4AvUGysDBGi2jRiPWUKbMRTbs_E,4569
47
47
  pycontrails/utils/temp.py,sha256=6BlJ5NaQpACyL-n3FuqfscFb9Mfbgvs72BwWfSzBfmU,1100
48
48
  pycontrails/utils/json.py,sha256=zB_23_mqE39G231sQ_XXmxpQQ9pGjIGQCPJ2JaknRrY,5990
49
49
  pycontrails/utils/dependencies.py,sha256=LBKnhlZHTKDOGFr3J17cnfbQbBtO3uGkKBVoOIhW01s,2488
50
50
  pycontrails/models/pcc.py,sha256=yWi0TochaCWCgrb68dUad9xPMqysIRa2hr6VT8PvxL4,11286
51
- pycontrails/models/tau_cirrus.py,sha256=DZABYvUFxBZxWS8EZTXCYu4hdgPX3TLSQ1JSrSsIrjg,4498
51
+ pycontrails/models/tau_cirrus.py,sha256=yNYw4ukT68w2ATGFZr3p8AZxB6A2xufXQq7XP2U51y0,5026
52
52
  pycontrails/models/__init__.py,sha256=dQTOLQb7RdUdUwslt5se__5y_ymbInBexQmNrmAeOdE,33
53
- pycontrails/models/issr.py,sha256=Uly0b8seOuWxYxDmnZehdeiggGKho_TxL4cTA56VYFQ,7522
54
- pycontrails/models/sac.py,sha256=YQJE9lo0dheodLJbdQRZinrUZSm7_0lvQ5Hm55w1sX0,16177
55
- pycontrails/models/accf.py,sha256=6CVluLj1qOPe_N6uYAWa_28MIA4EQk6sbJyP9Y88gSY,12567
53
+ pycontrails/models/issr.py,sha256=nfNJHKGyVEwkBun3u1kjR0WVPLK2zrdPjLGBnK5MWMs,7340
54
+ pycontrails/models/sac.py,sha256=uaupJine1s9ad5YyTCHpK6ixk6IZYtxDHhxHviMj2Y8,16075
55
+ pycontrails/models/accf.py,sha256=20XWID_6aoFLDOfanf5ncay_azPbZSA2NoowJSZbM20,12559
56
56
  pycontrails/models/dry_advection.py,sha256=_HJA02GPjlJH2OKhX3BAvQWJX0iV-bOu57hWPl2Ue60,16145
57
- pycontrails/models/pcr.py,sha256=8xddW6jgR3hmM43nl5hWAl22rRXUQZbuLQKSLwzMH-E,5867
57
+ pycontrails/models/pcr.py,sha256=veI1gtcYLZB9EUmp8siAI-WOIhxPuftsNMIPKrM-7gI,5463
58
58
  pycontrails/models/emissions/__init__.py,sha256=N_EE768TNRDbdmXaxly2Pwun7UmVBTVPc4k89VBz5ys,478
59
59
  pycontrails/models/emissions/ffm2.py,sha256=8JOW0tx9X5SmyEmW-b_9Xhg-OwGmKDfKbCj1_SDPCmY,11996
60
60
  pycontrails/models/emissions/emissions.py,sha256=JTdL2BXU3xekU3U5uc2Kg99F7xeQ57hyHv_1PxlX17A,47264
@@ -67,11 +67,11 @@ pycontrails/models/humidity_scaling/__init__.py,sha256=nqsab_j9BCwMbTfCn4BjXMdhI
67
67
  pycontrails/models/humidity_scaling/quantiles/era5-quantiles.pq,sha256=tfYhbafF9Z-gGCg6VQ1YBlOaK_01e65Dc6s9b-hQ6Zo,286375
68
68
  pycontrails/models/cocip/radiative_forcing.py,sha256=_dJ6_OM4fBvmhgL6MoDObhfTAUEXx-JzKqb5htYe1H8,44799
69
69
  pycontrails/models/cocip/wind_shear.py,sha256=Pr6ZBMnuWK380uzX2mSx0wkNXnufuCjOmV5vpUStRv0,3852
70
- pycontrails/models/cocip/cocip.py,sha256=X7aroA1ijOvY4Wz53XJW3L0D4_L0Sssvi4pxcqirxQU,88836
70
+ pycontrails/models/cocip/cocip.py,sha256=AMA5I_eR3m959Gfh7VXDy1L9laernIQ_PTV2Kdp3HCc,91752
71
71
  pycontrails/models/cocip/output_formats.py,sha256=UKzVc2R4Ij8uAsJbOFz1O9SZo9N5-mG0YfBLI6e_SZA,77118
72
72
  pycontrails/models/cocip/__init__.py,sha256=7Wy_CnmVqg_Gpg2UhIlisJOJ3naL6c5BBzTSJqdbiM4,902
73
- pycontrails/models/cocip/cocip_params.py,sha256=Dt5UJNd9yo0Pe_qLyQRpd2_1npA9ORZHK6tpmfy73lo,10531
74
- pycontrails/models/cocip/wake_vortex.py,sha256=6_JJvH01988nSJPSpUyg1TyDKr8qWKy6hlbU3iBpMsU,13319
73
+ pycontrails/models/cocip/cocip_params.py,sha256=rvOvE028yEs4H0WEPRyYx2kk8PDjvPmNkk43wUu-YRM,10295
74
+ pycontrails/models/cocip/wake_vortex.py,sha256=HclCU7CuNK_OkkhinWvZB5ipucyGnEsJ3q-_4E6bC5c,13314
75
75
  pycontrails/models/cocip/cocip_uncertainty.py,sha256=wJ43NJr3YZX92GiMhY6LUVni9qbsqKg0duCRSS_r_mw,11782
76
76
  pycontrails/models/cocip/radiative_heating.py,sha256=PngrHriQDSX1iDKu1v2g9NPRe4w6eGi6123xJD6itz8,18712
77
77
  pycontrails/models/cocip/contrail_properties.py,sha256=yMqDbAg751orkqPSKlUlnItsoa9JC8lcfxzeoGc8yEk,56007
@@ -83,7 +83,7 @@ pycontrails/models/ps_model/static/ps-aircraft-params-20230517.csv,sha256=sh6uNM
83
83
  pycontrails/models/cocipgrid/cocip_grid_params.py,sha256=DiKWJIDkYmitg0aW0hZqOe-8eftXsE2PrxdpS9tMnOo,6233
84
84
  pycontrails/models/cocipgrid/__init__.py,sha256=ar6bF_8Pusbb-myujz_q5ntFylQTNH8yiM8fxP7Zk30,262
85
85
  pycontrails/models/cocipgrid/cocip_time_handling.py,sha256=TSuMU06F09EaY9DYDJVpuGiqDVlV6tteGajjfPUb1oE,13869
86
- pycontrails/models/cocipgrid/cocip_grid.py,sha256=6RBe8YadOUpTgGQNT6zNdrIdTyfseW0joMUqmxtY0IQ,84060
86
+ pycontrails/models/cocipgrid/cocip_grid.py,sha256=HpUFNxlAJFMU58xgA0bnGoAqHVWXRBWIoIcKlfmG9HM,83904
87
87
  pycontrails/physics/geo.py,sha256=zc5D35pNQJ2UDTOJLTGTcf2mJRnNjzg4NJm1BzQoW2U,30160
88
88
  pycontrails/physics/units.py,sha256=7aFb4NVc0EIOyIU-fOmVHAIWMM3_AfqmEliUPWW0T64,12235
89
89
  pycontrails/physics/constants.py,sha256=fFDMpXMlldE6c5RbjaIn4UqGpXvX32mLuCG0RnxmtHE,2990
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.41.2)
2
+ Generator: bdist_wheel (0.41.3)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp311-cp311-macosx_11_0_arm64
5
5