class pycontrails.models.ps_model.PSFlight(met=None, params=None, **params_kwargs)#

Bases: AircraftPerformance

Simulate aircraft performance using Poll-Schumann (PS) model.


[Poll and Schumann, 2021] [Poll and Schumann, 2021]

Poll & Schumann (2022). An estimation method for the fuel burn and other performance characteristics of civil transport aircraft. Part 3 Generalisation to cover climb, descent and holding. Aero. J., submitted.

__init__(met=None, params=None, **params_kwargs)#


__init__([met, params])

calculate_aircraft_performance(*, ...)

Calculate aircraft performance along a trajectory.


Check if aircraft type designator is available in the PS model database.


Downselect met domain to the max/min bounds of source.


Add true_airspeed field to source data if not already present.


Evaluate the aircraft performance model.

get_source_param(key[, default, set_attr])

Get source data with default set by parameter key.


Ensure that met is a MetDataset.


Ensure that source is type_.


Attach original or copy of input source to source.

set_source_met([optional, variable])

Ensure or interpolate each required met_variables on source .

simulate_fuel_and_performance(*, ...)

Calculate aircraft mass, fuel mass flow rate, and overall propulsion efficiency.


Transfer met source metadata from met to source.


Update model parameters on params.



Instantiated model parameters, in dictionary form


Meteorology data


Data evaluated in model


Generate a unique hash for model instance.


Shortcut to create interpolation arguments from params.



Require meteorology is not None on __init__()


Required meteorology pressure level variables.



Optional meteorology variables



Set of required parameters if processing already complete on met input.

calculate_aircraft_performance(*, aircraft_type, altitude_ft, air_temperature, time, true_airspeed, aircraft_mass, engine_efficiency, fuel_flow, thrust, q_fuel, **kwargs)#

Calculate aircraft performance along a trajectory.

When time is not None, this method should be used for a single flight trajectory. Waypoints are coupled via the time parameter.

This method computes the rate of climb and descent (ROCD) to determine flight phases: “cruise”, “climb”, and “descent”. Performance metrics depend on this phase.

When time is None, this method can be used to simulate flight performance over an arbitrary sequence of flight waypoints by assuming nominal flight characteristics. In this case, each point is treated independently and all points are assumed to be in a “cruise” phase of the flight.

  • aircraft_type (str) – Used to query the underlying model database for aircraft engine parameters.

  • altitude_ft (npt.NDArray[np.float_]) – Altitude at each waypoint, [\(ft\)]

  • air_temperature (npt.NDArray[np.float_]) – Ambient temperature for each waypoint, [\(K\)]

  • time (npt.NDArray[np.datetime64] | None) – Waypoint time in np.datetime64 format. If None, only drag force will is used in thrust calculations (ie, no vertical change and constant horizontal change). In addition, aircraft is assumed to be in cruise.

  • true_airspeed (npt.NDArray[np.float_] | float | None) – True airspeed for each waypoint, [\(m s^{-1}\)]. If None, a nominal value is used.

  • aircraft_mass (npt.NDArray[np.float_] | float) – Aircraft mass for each waypoint, [\(kg\)].

  • engine_efficiency (npt.NDArray[np.float_] | float | None) – Override the engine efficiency at each waypoint.

  • fuel_flow (npt.NDArray[np.float_] | float | None) – Override the fuel flow at each waypoint, [\(kg s^{-1}\)].

  • thrust (npt.NDArray[np.float_] | float | None) – Override the thrust setting at each waypoint, [:math: N].

  • q_fuel (float) – Lower calorific value (LCV) of fuel, [\(J \ kg_{fuel}^{-1}\)].

  • **kwargs (Any) – Additional keyword arguments to pass to the model.


AircraftPerformanceData – Derived performance metrics at each waypoint.

check_aircraft_type_availability(aircraft_type, raise_error=True)#

Check if aircraft type designator is available in the PS model database.

  • aircraft_type (str) – ICAO aircraft type designator

  • raise_error (bool, optional) – Optional flag for raising an error, by default True.


bool – Aircraft found in the PS model database.


KeyError – raises KeyError if the aircraft type is not covered by database


alias of PSFlightParams

eval(source=None, **params)#

Evaluate the aircraft performance model.

The implementing model adds the following fields to the source flight:

  • aircraft_mass: aircraft mass at each waypoint, [\(kg\)]

  • fuel_flow: fuel mass flow rate at each waypoint, [\(kg s^{-1}\)]

  • thrust: thrust at each waypoint, [\(N\)]

  • engine_efficiency: engine efficiency at each waypoint

  • rocd: rate of climb or descent at each waypoint, [\(ft min^{-1}\)]

  • fuel_burn: fuel burn at each waypoint, [\(kg\)]

In addition, the following attributes are added to the source flight:

  • n_engine: number of engines

  • wingspan: wingspan, [\(m\)]

  • max_mach: maximum Mach number

  • max_altitude: maximum altitude, [\(m\)]

  • total_fuel_burn: total fuel burn, [\(kg\)]

  • source (Flight) – Flight trajectory to evaluate.

  • params (Any) – Override params with keyword arguments.


Flight – Flight trajectory with aircraft performance data.

long_name = 'Poll-Schumann Aircraft Performance Model'#

Meteorology data

met_variables = (MetVariable(short_name='t', standard_name='air_temperature', long_name='Air Temperature', level_type='isobaricInhPa', ecmwf_id=130, grib1_id=11, grib2_id=(0, 0, 0), units='K', amip='ta', description='Air temperature is the bulk temperature of the air, not the surface (skin) temperature.'),)#

Required meteorology pressure level variables. Each element in the list is a MetVariable or a tuple[MetVariable]. If element is a tuple[MetVariable], the variable depends on the data source. Only one variable in the tuple is required.

name = 'PSFlight'#
optional_met_variables = (MetVariable(short_name='u', standard_name='eastward_wind', long_name='Eastward Wind', level_type='isobaricInhPa', ecmwf_id=131, grib1_id=33, grib2_id=(0, 2, 2), units='m s**-1', amip='ua', description='"Eastward" indicates a vector component which is positive when directed eastward (negative westward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component.'), MetVariable(short_name='v', standard_name='northward_wind', long_name='Northward Wind', level_type='isobaricInhPa', ecmwf_id=132, grib1_id=34, grib2_id=(0, 2, 3), units='m s**-1', amip='va', description='"Northward" indicates a vector component which is positive when directed northward (negative southward). Wind is defined as a two-dimensional (horizontal) air velocity vector, with no vertical component.'))#

Optional meteorology variables


Instantiated model parameters, in dictionary form


Data evaluated in model