pycontrails.physics.jet¶
Jet aircraft trajectory and performance parameters.
This module includes common functions to calculate jet aircraft trajectory and performance parameters, including fuel quantities, mass, thrust setting, propulsion efficiency and load factors.
Functions
|
Calculate the acceleration/deceleration at each waypoint. |
|
Calculate air-to-fuel ratio from thrust setting. |
|
Estimate the payload mass based on the aircraft role. |
|
Estimate cargo load factor carried by passenger aircraft and dedicated freighters. |
|
Calculate angle between the horizontal plane and the actual flight path. |
|
Compute the Mach number from the true airspeed and ambient temperature. |
|
Calculate combustor inlet pressure, \(P_{3}\). |
|
Calculate combustor inlet temperature, \(T_{3}\). |
|
Calculate compressor inlet pressure for Jet engine, \(P_{2}\). |
|
Calculate compressor inlet temperature for Jet engine, \(T_{2}\). |
|
Estimate payload for passenger aircraft. |
|
Calculate the ratio of air density relative to the air density at mean-sea-level. |
Convert fuel mass flow rate at sea level to equivalent fuel flow rate at cruise conditions. |
|
Convert fuel mass flow rate at cruise conditions to equivalent flow rate at sea level. |
|
|
Calculate the fuel consumption at each waypoint. |
|
Estimate initial aircraft mass as a function of load factor and fuel requirements. |
|
Estimate number of seats for the provided aircraft type. |
|
Calculate the overall propulsion efficiency (OPE). |
|
Estimate payload for passenger aircraft. |
|
Estimate passenger load factor based on historical data. |
Calculate the ratio of ambient pressure relative to the surface pressure. |
|
|
Estimate reserve fuel requirements. |
Calculate the ratio of ambient temperature relative to the temperature at mean sea level. |
|
|
Calculate the thrust force at each waypoint. |
|
Calculate the non-dimensionalized thrust setting of a Jet engine. |
|
Calculate turbine inlet temperature, \(T_{4}\). |
|
Update aircraft mass based on the simulated total fuel consumption. |
- pycontrails.physics.jet.acceleration(true_airspeed, segment_duration)¶
Calculate the acceleration/deceleration at each waypoint.
- Parameters:
true_airspeed (
npt.NDArray[np.floating]) – True airspeed, [\(m \ s^{-1}\)]segment_duration (
npt.NDArray[np.floating]) – Time difference between waypoints, [\(s\)]
- Returns:
npt.NDArray[np.floating]– Acceleration/deceleration, [\(m \ s^{-2}\)]
See also
- pycontrails.physics.jet.air_to_fuel_ratio(thrust_setting, *, cruise=False, T_compressor_inlet=None)¶
Calculate air-to-fuel ratio from thrust setting.
- Parameters:
thrust_setting (
ArrayScalarLike) – Engine thrust setting, unitlesscruise (
bool) – Estimate thrust setting for cruise conditions. Defaults to False.T_compressor_inlet (
None | ArrayScalarLike) – Compressor inlet temperature, [\(K\)] Required ifcruiseis True. Defaults to None
- Returns:
ArrayScalarLike– Air-to-fuel ratio, unitless
References
AFR equation from [Stettler et al., 2013]
Scaling factor to cruise from Eq. (30) of [DuBois and Paynter, 2006]
- pycontrails.physics.jet.aircraft_payload(*, max_payload, aircraft_role='Passenger', n_seats=0, pax_lf=0.8, pax_mass=100.0, cargo_lf=0.2)¶
Estimate the payload mass based on the aircraft role.
- Parameters:
max_payload (
float) – Aircraft maximum payload, [\(kg\)]aircraft_role (
str) – Aircraft role, i.e., “Passenger”, “Cargo”, “Others”, etc. Assumes passenger aircraft (i.e., “Passenger”) by default. For dedicated freighters, the aircraft role should be set to “Cargo”.n_seats (
int) – Total number of seats in passenger aircraftpax_lf (
float) – Passenger load factor (between 0 and 1). Refer topassenger_load_factor()for historical values. Otherwise, defaults to 0.8pax_mass (
float) – Assumed passenger plus baggage mass, [\(kg\)] Defaults to the ICAO-recommend value of 100 kgcargo_lf (
float) – Cargo load factor (between 0 and 1) For “Passenger” aircraft, this is the assumed cargo load factor in the passenger hold. For “Cargo” aircraft, this is the assumed cargo load factor for dedicated freighters. Refer tocargo_load_factor()for reference values for passenger aircraft and freighters.
- Returns:
float– Estimated aircraft payload, [\(kg\)]
References
- cite:
Teoh et al. (2026), in preparation
- cite:
Dray et al. (2024), https://doi.org/10.1016/j.jairtraman.2024.102692
- pycontrails.physics.jet.cargo_load_factor(origin_airport_icao=None, destination_airport_icao=None, total_flight_dist=None, passenger_aircraft=True)¶
Estimate cargo load factor carried by passenger aircraft and dedicated freighters.
Accounts for regional asymmetries in freight flow and distance-specific variability
- Parameters:
origin_airport_icao (
str | None) – ICAO code of origin airport. If None is provided, then assume global mean values.destination_airport_icao (
str | None) – ICAO code of destination airport. If None is provided, then assume global mean values.total_flight_dist (
float) – Total flight distance flown, [\(km\)] Use great-circle distance between first and last known waypoint for consistency with the cargo database.passenger_aircraft (
bool) – Use cargo load factors for the passenger hold if true, otherwise use cargo load factors for dedicated freighters
- Returns:
float– Passenger load factor [0 - 1], unitless
- pycontrails.physics.jet.climb_descent_angle(true_airspeed, rocd)¶
Calculate angle between the horizontal plane and the actual flight path.
- Parameters:
true_airspeed (
npt.NDArray[np.floating]) – True airspeed, [\(m \ s^{-1}\)]rocd (
npt.NDArray[np.floating]) – Rate of climb/descent, [\(ft min^{-1}\)]
- Returns:
npt.NDArray[np.floating]– Climb (positive value) or descent (negative value) angle, [\(\deg\)]
- pycontrails.physics.jet.clip_mach_number(true_airspeed, air_temperature, max_mach_number)¶
Compute the Mach number from the true airspeed and ambient temperature.
This method clips the computed Mach number to the value of
max_mach_number.If no mach number exceeds
max_mach_number, the original arraytrue_airspeedand the computed Mach number are returned.- Parameters:
true_airspeed (
npt.NDArray[np.floating]) – Array of true airspeed, [\(m \ s^{-1}\)]air_temperature (
npt.NDArray[np.floating]) – Array of ambient temperature, [:math: K]max_mach_number (
ArrayOrFloat) – Maximum mach number associated to aircraft. If no clipping is desired, this can be set tp np.inf.
- Returns:
true_airspeed (
npt.NDArray[np.floating]) – Array of true airspeed, [\(m \ s^{-1}\)]. All values are clipped atmax_mach_number.mach_num (
npt.NDArray[np.floating]) – Array of Mach numbers, [\(Ma\)]. All values are clipped atmax_mach_number.
- pycontrails.physics.jet.combustor_inlet_pressure(pressure_ratio, p_comp_inlet, thrust_setting)¶
Calculate combustor inlet pressure, \(P_{3}\).
- Parameters:
pressure_ratio (
float) – Engine pressure ratio, unitlessp_comp_inlet (
ArrayScalarLike) – Compressor inlet pressure, [\(Pa\)]thrust_setting (
ArrayScalarLike) – Engine thrust setting, unitless
- Returns:
ArrayScalarLike– Combustor inlet pressure, [\(Pa\)]
References
- pycontrails.physics.jet.combustor_inlet_temperature(comp_efficiency, T_comp_inlet, p_comp_inlet, p_comb_inlet)¶
Calculate combustor inlet temperature, \(T_{3}\).
- Parameters:
comp_efficiency (
float) – Engine compressor efficiency, [\(0 - 1\)]T_comp_inlet (
ArrayScalarLike) – Compressor inlet temperature, [\(K\)]p_comp_inlet (
ArrayScalarLike) – Compressor inlet pressure, [\(Pa\)]p_comb_inlet (
ArrayScalarLike) – Compressor inlet pressure, [\(Pa\)]
- Returns:
ArrayScalarLike– Combustor inlet temperature, [\(K\)]
References
- pycontrails.physics.jet.compressor_inlet_pressure(p, mach_num)¶
Calculate compressor inlet pressure for Jet engine, \(P_{2}\).
- Parameters:
p (
ArrayScalarLike) – Ambient pressure, [\(Pa\)]mach_num (
ArrayScalarLike) – Mach number
- Returns:
ArrayScalarLike– Compressor inlet pressure, [\(Pa\)]
References
- pycontrails.physics.jet.compressor_inlet_temperature(T, mach_num)¶
Calculate compressor inlet temperature for Jet engine, \(T_{2}\).
- Parameters:
T (
ArrayScalarLike) – Ambient temperature, [\(K\)]mach_num (
ArrayScalarLike) – Mach number
- Returns:
ArrayScalarLike– Compressor inlet temperature, [\(K\)]
References
- pycontrails.physics.jet.dedicated_freighter_payload(max_payload, cargo_lf)¶
Estimate payload for passenger aircraft.
- Parameters:
max_payload (
float) – Aircraft maximum payload, [\(kg\)]cargo_lf (
float) – Cargo load factor for dedicated freighters (between 0 and 1). Refer tocargo_load_factor()for origin-destination specific reference values.
- Returns:
float– Estimated cargo aircraft payload, [\(kg\)]
References
- cite:
Teoh et al. (2026), in preparation
- pycontrails.physics.jet.density_ratio(rho)¶
Calculate the ratio of air density relative to the air density at mean-sea-level.
- Parameters:
rho (
npt.NDArray[np.floating]) – Air density, [\(kg \ m^{3}\)]- Returns:
npt.NDArray[np.floating]– Ratio of the density to the air density at mean sea-level (MSL).
- pycontrails.physics.jet.equivalent_fuel_flow_rate_at_cruise(fuel_flow_sls, theta_amb, delta_amb, mach_num)¶
Convert fuel mass flow rate at sea level to equivalent fuel flow rate at cruise conditions.
Refer to Eq. (40) in [DuBois and Paynter, 2006].
- Parameters:
fuel_flow_sls (
npt.NDArray[np.floating] | float) – Fuel mass flow rate, [\(kg s^{-1}\)]theta_amb (
ArrayOrFloat) – Ratio of the ambient temperature to the temperature at mean sea-level.delta_amb (
ArrayOrFloat) – Ratio of the pressure altitude to the surface pressure.mach_num (
ArrayOrFloat) – Mach number
- Returns:
npt.NDArray[np.floating]– Estimate of fuel mass flow rate at sea level, [\(kg \ s^{-1}\)]
References
- pycontrails.physics.jet.equivalent_fuel_flow_rate_at_sea_level(fuel_flow_cruise, theta_amb, delta_amb, mach_num)¶
Convert fuel mass flow rate at cruise conditions to equivalent flow rate at sea level.
Refer to Eq. (40) in [DuBois and Paynter, 2006].
- Parameters:
fuel_flow_cruise (
npt.NDArray[np.floating]) – Fuel mass flow rate per engine, [\(kg s^{-1}\)]theta_amb (
npt.NDArray[np.floating]) – Ratio of the ambient temperature to the temperature at mean sea-level.delta_amb (
npt.NDArray[np.floating]) – Ratio of the pressure altitude to the surface pressure.mach_num (
npt.NDArray[np.floating]) – Mach number, [:math: Ma]
- Returns:
npt.NDArray[np.floating]– Estimate of fuel flow per engine at sea level, [\(kg \ s^{-1}\)].
References
- pycontrails.physics.jet.fuel_burn(fuel_flow, segment_duration)¶
Calculate the fuel consumption at each waypoint.
- Parameters:
fuel_flow (
npt.NDArray[np.floating]) – Fuel mass flow rate, [\(kg s^{-1}\)]segment_duration (
npt.NDArray[np.floating]) – Time difference between waypoints, [\(s\)]
- Returns:
npt.NDArray[np.floating]– Fuel consumption at each waypoint, [\(kg\)]
- pycontrails.physics.jet.initial_aircraft_mass(*, amass_oew, amass_mtow, payload, total_fuel_burn, total_reserve_fuel, oew_uplift=1.03)¶
Estimate initial aircraft mass as a function of load factor and fuel requirements.
This function uses the following equation:
TOM = (OEM * OEM_uplift) + PM + FM_res + TFM TOM = min(TOM, MTOW)
where: - TOM is the aircraft take-off mass - OEM is the aircraft operating empty weight - OEM_uplift is a multiple applied to the operating empty weight to account for biases - PM is the payload mass - FM_res is the mass of the reserve fuel - TFM is the trip fuel mass - MTOW is the aircraft maximum take-off weight
- Parameters:
amass_oew (
float) – Aircraft operating empty weight, i.e. the basic weight of an aircraft including the crew and necessary equipment, but excluding usable fuel and payload, [\(kg\)]amass_mtow (
float) – Aircraft maximum take-off weight, [\(kg\)]payload (
float) – Aircraft payload, [\(kg\)]total_fuel_burn (
float) – Total fuel consumption for the flight, obtained from prior iterations, [\(kg\)]total_reserve_fuel (
float) – Total reserve fuel requirements, [\(kg\)]oew_uplift (
float) – Multiple to increase operational empty weight. Defaults to 1.03, following Cirium (2025).
- Returns:
float– Aircraft mass at the initial waypoint, [\(kg\)]
References
Cirium EmeraldSky Emissions Methodology 2025: Detailed Description v1.8, p. 9.
See also
- pycontrails.physics.jet.number_of_seats(aircraft_type=None)¶
Estimate number of seats for the provided aircraft type.
- pycontrails.physics.jet.overall_propulsion_efficiency(true_airspeed, F_thrust, fuel_flow, q_fuel, is_descent, threshold=0.5)¶
Calculate the overall propulsion efficiency (OPE).
Negative OPE values can occur during the descent phase and is clipped to a lower bound of 0, while an upper bound of
thresholdis also applied. The most efficient engines today do not exceed this value.- Parameters:
true_airspeed (
npt.NDArray[np.floating]) – True airspeed for each waypoint, [\(m s^{-1}\)].F_thrust (
npt.NDArray[np.floating]) – Thrust force provided by the engine, [\(N\)].fuel_flow (
npt.NDArray[np.floating]) – Fuel mass flow rate, [\(kg s^{-1}\)].q_fuel (
float) – Lower calorific value (LCV) of fuel, [\(J \ kg_{fuel}^{-1}\)].is_descent (
npt.NDArray[np.floating] | None) – Boolean array that indicates if a waypoint is in a descent phase.threshold (
float) – Upper bound for realistic engine efficiency.
- Returns:
npt.NDArray[np.floating]– Overall propulsion efficiency (OPE)
References
- pycontrails.physics.jet.passenger_aircraft_payload(max_payload, n_seats, pax_lf, cargo_lf, *, pax_mass=100.0)¶
Estimate payload for passenger aircraft.
- Parameters:
max_payload (
float) – Aircraft maximum payload, [\(kg\)]n_seats (
int) – Total number of seats in passenger aircraftpax_lf (
float) – Passenger load factor (between 0 and 1). Refer topassenger_load_factor()for historical regional-specific values.cargo_lf (
float) – Cargo load factor in the passenger hold (between 0 and 1). Refer tocargo_load_factor()for origin-destination specific reference values.pax_mass (
float) – Assumed passenger plus baggage mass, [\(kg\)] Defaults to the ICAO-recommend value of 100 kg
- Returns:
float– Estimated passenger aircraft payload, [\(kg\)]
References
- cite:
Dray et al. (2024), https://doi.org/10.1016/j.jairtraman.2024.102692
- pycontrails.physics.jet.passenger_load_factor(origin_airport_icao=None, first_waypoint_time=None)¶
Estimate passenger load factor based on historical data.
Accounts for regional and seasonal differences.
- Parameters:
origin_airport_icao (
str | None) – ICAO code of origin airport. If None is provided, then globally averaged values will be assumed at first_waypoint_time.first_waypoint_time (
pd.Timestamp | None) – First waypoint UTC time. If None is provided, then regionally or globally averaged values from the trailing twelve months will be used.
- Returns:
float– Passenger load factor [0 - 1], unitless
- pycontrails.physics.jet.pressure_ratio(p)¶
Calculate the ratio of ambient pressure relative to the surface pressure.
- Parameters:
p (
npt.NDArray[np.floating]) – Air pressure, [\(Pa\)]- Returns:
npt.NDArray[np.floating]– Ratio of the pressure altitude to the surface pressure.
- pycontrails.physics.jet.reserve_fuel_requirements(rocd, altitude_ft, fuel_flow, fuel_burn)¶
Estimate reserve fuel requirements.
- Parameters:
rocd (
npt.NDArray[np.floating]) – Rate of climb and descent, [\(ft \ min^{-1}\)]altitude_ft (
npt.NDArray[np.floating]) – Altitude, [\(ft\)]fuel_flow (
npt.NDArray[np.floating]) – Fuel mass flow rate, [\(kg \ s^{-1}\)].fuel_burn (
npt.NDArray[np.floating]) – Fuel consumption for each waypoint, [\(kg\)]
- Returns:
npt.NDArray[np.floating]– Reserve fuel requirements, [\(kg\)]
References
Notes
The real-world calculation of the reserve fuel requirements is highly complex (refer to Section 2.3.3 of [Wasiuk et al., 2015]). This implementation is simplified by taking the maximum between the following two conditions:
Fuel required to fly +90 minutes at the main cruise altitude at the end of the cruise aircraft weight.
Uplift the total fuel consumption for the flight by +15%
See also
- pycontrails.physics.jet.temperature_ratio(T)¶
Calculate the ratio of ambient temperature relative to the temperature at mean sea level.
- Parameters:
T (
npt.NDArray[np.floating]) – Air temperature, [\(K\)]- Returns:
npt.NDArray[np.floating]– Ratio of the temperature to the temperature at mean sea-level (MSL).
- pycontrails.physics.jet.thrust_force(altitude, true_airspeed, segment_duration, aircraft_mass, F_drag)¶
Calculate the thrust force at each waypoint.
- Parameters:
altitude (
npt.NDArray[np.floating]) – Waypoint altitude, [\(m\)]true_airspeed (
npt.NDArray[np.floating]) – True airspeed, [\(m \ s^{-1}\)]segment_duration (
npt.NDArray[np.floating]) – Time difference between waypoints, [\(s\)]aircraft_mass (
npt.NDArray[np.floating]) – Aircraft mass, [\(kg\)]F_drag (
npt.NDArray[np.floating]) – Draft force, [\(N\)]
- Returns:
npt.NDArray[np.floating]– Thrust force, [\(N\)]
References
Notes
The model balances the rate of forces acting on the aircraft with the rate in increase in energy.
This estimate of thrust force is used in the BADA Total-Energy Model (Eq. 3.2-1).
Negative thrust must be corrected.
- pycontrails.physics.jet.thrust_setting_nd(true_airspeed, thrust_setting, T, p, pressure_ratio, q_fuel, *, comp_efficiency=0.9, cruise=False)¶
Calculate the non-dimensionalized thrust setting of a Jet engine.
Result is in terms of the ratio of turbine inlet to the compressor inlet temperature (t4_t2)
- Parameters:
true_airspeed (
ArrayScalarLike) – True airspeed, [\(m \ s^{-1}\)]thrust_setting (
ArrayScalarLike) – Engine thrust setting, unitlessT (
ArrayScalarLike) – Ambient temperature, [\(K\)]p (
ArrayScalarLike) – Ambient pressure, [\(Pa\)]pressure_ratio (
float) – Engine pressure ratio, unitlessq_fuel (
float) – Lower calorific value (LCV) of fuel, \([J \ kg_{fuel}^{-1}]\)comp_efficiency (
float, optional) – Engine compressor efficiency, [\(0 - 1\)]. Defaults to 0.9cruise (
bool, optional) – Defaults to False
- Returns:
ArrayScalarLike– Ratio of turbine inlet to the compressor inlet temperature, unitless
References
- pycontrails.physics.jet.turbine_inlet_temperature(afr, T_comb_inlet, q_fuel)¶
Calculate turbine inlet temperature, \(T_{4}\).
- Parameters:
afr (
ArrayScalarLike) – Air-to-fuel ratio, unitlessT_comb_inlet (
ArrayScalarLike) – Combustor inlet temperature, [\(K\)]q_fuel (
float) – Lower calorific value (LCV) of fuel, \([J \ kg_{fuel}^{-1}]\)
- Returns:
ArrayScalarLike– Tubrine inlet temperature, [\(K\)]
References
- pycontrails.physics.jet.update_aircraft_mass(*, amass_oew, amass_mtow, payload, fuel_burn, total_reserve_fuel, takeoff_mass)¶
Update aircraft mass based on the simulated total fuel consumption.
Used internally for finding aircraft mass iteratively.
- Parameters:
amass_oew (
float) – Aircraft operating empty weight, i.e. the basic weight of an aircraft including the crew and necessary equipment, but excluding usable fuel and payload, [\(kg\)].ref_mass (
float) – Aircraft reference mass, [\(kg\)].amass_mtow (
float) – Aircraft maximum take-off weight, [\(kg\)].payload (
float) – Aircraft payload, [\(kg\)]fuel_burn (
npt.NDArray[np.floating]) – Fuel consumption for each waypoint, [\(kg\)]total_reserve_fuel (
float) – Total reserve fuel requirements, [\(kg\)]takeoff_mass (
float | None) – Initial aircraft mass, [\(kg\)]. If None, the initial mass is calculated usinginitial_aircraft_mass(). If supplied, all other parameters exceptfuel_burnare ignored.
- Returns:
npt.NDArray[np.floating]– Updated aircraft mass, [\(kg\)]
See also
fuel_burn,reserve_fuel_requirements,initial_aircraft_mass,aircraft_load_factor