Releases: contrailcirrus/pycontrails
v0.45.0
Add experimental support for simulating radiative effects due to contrail-contrail overlap.
Features
- Support simulating contrail contrail overlap when running the
Cocip
model with aFleet
source. Thecontrail_contrail_overlapping
anddz_overlap_m
parameters govern the overlap calculation. This mode of calculation is still experimental and may change in future releases. - Rewrite the
pycontrails.models.cocip.output
modules into a singlepycontrails.cocip.output_formats
module. The new module supports flight waypoint summary statistics, contrail waypoints summary statistics, gridded outputs, and time-slice outputs. - Add new
GeoVectorDataset.to_lon_lat_grid
method. This method can be thought of as a partial inverse to theMetDataset.to_vector
method. The current implementation is brittle and may be revised in a future release.
Fixes
- Extend
Models.set_source_met
to allowinterpolation_q_method="cubic-spline"
when working withMetDataset
source (ie, so-called gridded models). Previously aNotImplementedError
was raised. - Ensure the
Flight.copy
implementation works withFleet
instances as well. - Avoid looping over
keys
twice inVectorDataset.broadcast_attrs
. This is a slight performance enhancement. - Fix
Fleet
signature for compatibility withFlight
. - Fix a few hard-coded assumptions in broadcasting aircraft performance and emissions when running
Cocip
with aFleet
source. The previous implementation did not consider the possibility of aircraft performance variables onFlight.data
andFlight.attrs
separately.
Internals
- Add optional
raise_error
parameter to theVectorDataset.broadcast_attrs
method. - Update
Fleet
internals.
v0.44.2
Fixes
- Narrow type hints on the ABC
AircraftPerformance
model. TheAircraftPerformance.eval
method requires aFlight
object for thesource
parameter. - In
PSModel.eval
, explicitly set any aircraft performance data at waypoints with zero true airspeed tonp.nan
. This avoids numpyRuntimeWarning
s without affecting the results. - Fix corner-case in the
polygon.buffer_and_clean
function in which the polygon created by buffering theopencv
contour is not valid. Now a second attempt to buffer the polygon is made with a smaller buffer distance. - Ignore RuntimeError raised in
scipy.optimize.newton
if the maximum number of iterations is reached before convergence. This is a workaround for occasional false positive convergence warnings. The pycontrails use-case may be related to this GitHub issue. - Update the
Models.__init__
warnings whenhumidity_scaling
is not provided. The previous warning provided an outdated code example. - Ensure the
interpolation_q_method
used in a parent model is passed into thehumidity_scaling
child model in theModels.__init__
method. If the twointerpolation_q_method
values are different, a warning is issued. This could be extended to other model parameters in the future.
Features
- Enable
ExponentialBoostLatitudeCorrectionHumidityScaling
humidity scaling for the model parameterinterpolation_q_method="cubic_spline"
. - Add GFS notebook example.
Breaking changes
- Remove
ExponentialBoostLatitudeCorrectionHumidityScalingParams
. These parameters are now hard-coded in theExponentialBoostLatitudeCorrectionHumidityScaling
model.
v0.44.1
Breaking changes
- By default, call
xr.open_mfdataset
withlock=False
in theMetDataSource.open_dataset
method. This helps alleviate adask
threading issue similar to this GitHub issue.
Fixes
- Support
MetDataset
source in theHistogramMatching
humidity scaling model. Previously onlyGeoVectorDataset
sources were explicitly supported. - Replace
np.gradient
withdask.array.gradient
in thetau_cirrus
module. This ensures that the computation is done lazily for dask-backed arrays. - Round to 6 digits in the
polygon.determine_buffer
function. This avoid unnecessary warnings for rounding errors. - Fix type hint for
opencv-python
4.8.0.74.
Internals
- Take more care with
float
andint
types in thecontrail_properties
module. Prefernp.clip
tonp.where
ornp.maximum
for clipping values. - Support
air_temperature
inCocipGrid
verbose formation outputs. - Remove
pytest-timeout
dev dependency.
v0.44.0
Support for the Poll-Schumann aircraft performance model.
Features
-
Implement a basic working version of the Poll-Schumann (PS) aircraft performance model. This is experimental and may undergo revision in future releases. The PS Model currently supports the following 53 aircraft types:
- A30B
- A306
- A310
- A313
- A318
- A319
- A320
- A321
- A332
- A333
- A342
- A343
- A345
- A346
- A359
- A388
- B712
- B732
- B733
- B734
- B735
- B736
- B737
- B738
- B739
- B742
- B743
- B744
- B748
- B752
- B753
- B762
- B763
- B764
- B77L
- B772
- B77W
- B773
- B788
- B789
- E135
- E145
- E170
- E195
- MD82
- MD83
- GLF5
- CRJ9
- DC93
- RJ1H
- B722
- A20N
- A21N
The "gridded" version of this model is not yet implemented. This will be added in a future release.
-
Improve the runtime of instantiating the
Emissions
model by a factor of 10-15x. This translates to a time savings of several hundred milliseconds on modern hardware. This improvement is achieved by more efficient parsing of the underlying static data and by deferring the construction of the interpolation artifacts until they are needed. -
Automatically use a default engine type from the aircraft type in the
Emissions
model if anengine_uid
parameter is not included on thesource
. This itself is configurable via theuse_default_engine_uid
parameter on theEmissions
model. The default mappings from aircraft types to engines is included inpycontrails/models/emissions/static/default-engine-uids.csv
.
Breaking changes
- Remove the
Aircraft
dataclass fromFlight
instantiation. Any code previously using this should instead directly pass additionalattrs
to theFlight
constructor. - The
load_factor
is now required inAircraftPerformance
models. The globalDEFAULT_LOAD_FACTOR
constant inpycontrails.models.aircraft_performance
provides a reasonable default. This is currently set to 0.7. - Use a
takeoff_mass
parameter inAircraftPerformance
models if provided in thesource.attrs
data. - No longer use a reference mass
ref_mass
inAircraftPerformance
models. This is replaced by thetakeoff_mass
parameter if provided, or calculated from operating empty operating mass, max payload mass, total fuel consumption mass, reserve fuel mass, and the load factor.
Fixes
- Remove the
fuel
parameter from theEmissions
model. This is inferred directly from thesource
parameter inEmissions.eval
. - Fix edge cases in the
jet.reserve_fuel_requirements
implementation. The previous version would returnnan
for some combinations offuel_flow
andsegment_phase
variables. - Fix a spelling mistake:
units.kelvin_to_celcius
->units.kelvin_to_celsius
.
Internals
- Use
ruff
in place ofpydocstyle
for linting docstrings. - Use
ruff
in place ofisort
for sorting imports. - Update the
AircraftPerformance
template based on the patterns used in the newPSModel
class. This may change again in the future.
v0.43.0
Support experimental interpolation against gridded specific humidity. Add new data-driven humidity scaling models.
Features
-
Add new experimental
interpolation_q_method
field to theModelParams
data class. This parameter controls the interpolation methodology when interpolation against gridded specific humidity. The possible values are:None
: Interpolate linearly against specific humidity. This is the default behavior and is the same as the previous behavior."cubic-spline"
: Apply cubic-spline scaling to the interpolation table vertical coordinate before interpolating linearly against specific humidity."log-q-log-p"
: Interpolate in the log-log domain against specific humidity and pressure.
This interpolation parameter is used when calling
pycontrails.core.models.interpolate_met
. It can also be used directly with the new lower-levelpycontrails.core.models.interpolate_gridded_specific_humidity
function. -
Add new experimental
HistogramMatching
humidity scaling model to match RHi values against IAGOS observations. The previousHistogramMatchingWithEckel
scaling is still available when working with ERA5 ensemble members. -
Add new tutorial discussing the new specific humidity interpolation methodology.
Breaking changes
- Add an optional
q_method
parameter to thepycontrails.core.models.interpolate_met
function. The default valueNone
agrees with the previous behavior. - Change function signatures in the
cocip.py
module for consistency. Theinterp_kwargs
parameter is now unpacked in thecalc_timestep_meterology
signature. Renamekwargs
tointerp_kwargs
where appropriate. - Remove the
cache_size
parameter inMetDataset.from_zarr
. Previously this parameter allowed the user to wrap the Zarr store in aLRUCacheStore
to improve performance. Changes to Zarr internals have broken this approach. Custom Zarr patterns should now be handled outside ofpycontrails
.
Fixes
- Recompute and extend quantiles for histogram matching humidity scaling. Quantiles are now available for each combination of
q_method
and the following ERA5 data products: reanalysis and ensemble members 0-9. This data is available as a parquet file and is packaged withpycontrails
. - Fix the precomputed Eckel coefficients. Previous values where computed for different interpolation assumptions and were not correct for the default interpolation method.
- Clip the scaled humidity values computed by the
humidity_scaling.eckel_scaling
function to ensure that they are non-negative. Previously, both relative and specific humidity values arising from Eckel scaling could be negative. - Handle edge case of all NaN values in the
T_critical_sac
function in thesac.py
module. - Avoid extraneous copy when calling
VectorDataset.sum
. - Officially support
numpy
v1.25.0. - Set a
pytest-timeout
limit for tests intests/unit/test_ecmwf.py
to avoid hanging tests. - Add
forecast_step
parameter to theACCF
model.
Internals
- Refactor auxillary functions used by
HistogramMatchingWithEckel
to better isolated histogram matching from Eckel scaling. - Refactor
intersect_met
method inpycontrails.core.models
to handle experimentalq_method
parameter. - Include a
q_method
field inModel.interp_kwargs
. - Include precomputed humidity lapse rate values in the new
pycontrails.core.models._load_spline
function. - Move the
humidity_scaling.py
module into its own subdirectory withinpycontrails/models
.
v0.42.2
This is a re-release of v0.42.1, which didn't make it to PyPI. The release notes from v0.42.1 are copied below.
Features
- Add new
HistogramMatchingWithEckel
experimental humidity scaling model. This is still a work in progress. - Add new
Flight.fit_altitude
method which uses piecewise linear fitting to smooth a flight profile. - Add new
pycontrails.core.flightplan
module for parsing ATC flight plans between string and dictionary representations. - Add new airports and flightplan examples.
Breaking changes
- No longer attach empty fields "sdr", "rsr", "olr", "rf_sw", "rf_lw", "rf_net" onto the
source
parameter inCocip.eval
when the flight doesn't generate any persistent contrails. - Remove params
humidity_scaling
,rhi_adj_uncertainty
, andrhi_boost_exponent_uncertainty
fromCocipUncertaintyParams
. - Change the default value for
parallel
from True to False inxr.open_mfdataset
. This can be overridden by setting thexr_kwargs
parameter inERA5.open_metdataset
.
Fixes
- Fix a unit test (
test_dtypes.py::test_issr_sac_grid_output
) that occasionally hangs. There may be another test intest_ecmwf.py
that suffers from the same issue. - Fix issue encountered in
Cocip.eval
when concatenating contrails with inconsistent values for_out_of_bounds
. This is only relevant when running the model with the experimental parameterinterpolation_use_indices=True
. - Add a
Fleet.max_distance_gap
property. The previous property on theFlight
class was not applicable toFleet
instances. - Fix warning in
Flight
class to correctly suggest adding kwargdrop_duplicated_times
. - Fix an issue in the
VectorDataset
constructor with adata
parameter of typepd.DataFrame
. Previously, time data was rewritten to the underlying DataFrame. This could cause copy-on-write issues if the DataFrame was a view of another DataFrame. This is now avoided.
Internals
- When possible, replace type hints
np.ndarray
->np.typing.NDArray[np.float_]
in thecocip
,cocip_params
,cocip_uncertainty
,radiative_forcing
, andwake_vortex
modules. - Slight performance enhancements in the
radiative_forcing
module. - Change the default value of
u_wind
andv_wind
from None to 0 inFlight.segment_true_airspeed
. This makes more sense semantically.
v0.42.1
Features
- Add new
HistogramMatchingWithEckel
experimental humidity scaling model. This is still a work in progress. - Add new
Flight.fit_altitude
method which uses piecewise linear fitting to smooth a flight profile. - Add new
pycontrails.core.flightplan
module for parsing ATC flight plans between string and dictionary representations. - Add new airports and flightplan examples.
Breaking changes
- No longer attach empty fields "sdr", "rsr", "olr", "rf_sw", "rf_lw", "rf_net" onto the
source
parameter inCocip.eval
when the flight doesn't generate any persistent contrails. - Remove params
humidity_scaling
,rhi_adj_uncertainty
, andrhi_boost_exponent_uncertainty
fromCocipUncertaintyParams
. - Change the default value for
parallel
from True to False inxr.open_mfdataset
. This can be overridden by setting thexr_kwargs
parameter inERA5.open_metdataset
.
Fixes
- Fix a unit test (
test_dtypes.py::test_issr_sac_grid_output
) that occasionally hangs. There may be another test intest_ecmwf.py
that suffers from the same issue. - Fix issue encountered in
Cocip.eval
when concatenating contrails with inconsistent values for_out_of_bounds
. This is only relevant when running the model with the experimental parameterinterpolation_use_indices=True
. - Add a
Fleet.max_distance_gap
property. The previous property on theFlight
class was not applicable toFleet
instances. - Fix warning in
Flight
class to correctly suggest adding kwargdrop_duplicated_times
. - Fix an issue in the
VectorDataset
constructor with adata
parameter of typepd.DataFrame
. Previously, time data was rewritten to the underlying DataFrame. This could cause copy-on-write issues if the DataFrame was a view of another DataFrame. This is now avoided.
Internals
- When possible, replace type hints
np.ndarray
->np.typing.NDArray[np.float_]
in thecocip
,cocip_params
,cocip_uncertainty
,radiative_forcing
, andwake_vortex
modules. - Slight performance enhancements in the
radiative_forcing
module. - Change the default value of
u_wind
andv_wind
from None to 0 inFlight.segment_true_airspeed
. This makes more sense semantically.
v0.42.0
Phase 1 of the Spire datalib, which contains functions to identify unique flight trajectories from the raw Spire ADS-B data.
Features
- Add a
pycontrails.core.airport
module to read and process the global airport database, which can be used to identify the nearest airport to a given coordinate. - Add a
pycontrails.datalib.spire.clean
function to remove and address erroneous waypoints in the raw Spire ADS-B data. - Add a
pycontrails.datalib.spire.filter_altitude
function to remove noise in cruise altitude. - Add a
pycontrails.datalib.spire.identify_flights
function to identify unique flight trajectories from ADS-B messages. - Add a
pycontrails.datalib.spire.validate_trajectory
function to check the validity of the identified trajectories from ADS-B messages. - Add a
FlightPhase
integerEnum
in theflight
module. This includes a newlevel_flight
flight phase.
Internals
- Add unit tests providing examples to identify unique flights.
- Rename
flight._dt_waypoints
->flight.segment_duration
. - Move
jet.rate_of_climb_descent
->flight.segment_rocd
. - Move
jet.identify_phase_of_flight
->flight.segment_phase
. - Update
FlightPhase
to be a dictionary enumeration of flight phases. - Add references to
traffic
library.
v0.41.0
Improve polygon algorithms.
Features
- Rewrite the
polygon
module to run computation with opencv in place of scikit-image for finding contours. This change improves the algorithm runtime and fixes some previous unstable behavior in finding nested contours. For an introduction to the methodology, see the OpenCV contour tutorial.
Breaking changes
- Completely rewrite the
polygon
module. Replace the "main" public functionpolygon.find_contours_to_depth
withpolygon.find_multipolygon
. Replace thepolygon.contour_to_lat_lon
function withpolygon.multipolygon_to_geojson
. Returnshapely
objects when convenient to do so. - Convert continuous data to binary for polygon computation.
- Remove parameters
min_area_to_iterate
anddepth
in theMetDataArray.to_polygon_feature
method. Thedepth
parameter has been replaced by the booleaninteriors
parameter. Add aproperties
parameter for adding properties to thePolygon
andMultiPolygon
features. Themax_area
andepsilon
parameters are now expressed in terms of latitude-longitude degrees.
Internals
- Add
opencv-python-headless>=4.5
as an optional "vis" dependency. Some flavor ofopencv
is required for the updated polygon algorithms.
v0.40.1
Fixes
- Use oldest-supported-numpy for building pycontrails wheels. This allows pycontrails to be compatible with environments that use old versions of numpy. The pycontrails v0.40.0 wheels are not compatible with numpy 1.22.
- Fix a unit test (
test_dtypes.py::test_issr_sac_grid_output
) that occasionally hangs.