pycontrails.models.emissions.nvpm

Support for nvPM emissions modeling.

This module includes models related to estimating the non-volatile particulate matter (nvPM) mass and number emissions index. Here, the terms “non-volatile particulate matter” (nvPM) and “black carbon” (BC) are assumed with the same definition and used interchangeably.

Functions

air_density_combustor_exit(air_temperature, ...)

Estimate air density at the combustor exit.

air_to_fuel_ratio_imfox(thrust_setting)

Calculate the air-to-fuel ratio at cruise conditions via Abrahamson's method.

convert_nvpm_mass_concentration_to_ei(c_bc, ...)

Convert the nvPM mass concentration to an emissions index.

dopelheuer_lecht_scaling_factor(t_fl_cru, ...)

Estimate scaling factor to convert reference nvPM mass concentration from ground to cruise.

estimate_nvpm_meem(nvpm_ei_m_profile, ...)

Calculate nvPM mass and number emissions index using the MEEM2 methodology.

estimate_nvpm_t4_t2(edb_nvpm, true_airspeed, ...)

Calculate nvPM mass and number emissions index using the T4/T2 methodology.

exhaust_gas_volume_per_kg_fuel(afr, *[, ...])

Calculate the volume of exhaust gas per mass of fuel burnt.

flame_temperature(t_3)

Calculate the flame temperature at the combustion chamber (t_fl).

geometric_mean_diameter_sac(air_pressure, ...)

Calculate the nvPM GMD for singular annular combustor (SAC) engines.

geometric_mean_diameter_scope11(c_bc_c)

Estimate nvPM geometric mean diameter for SCOPE11 applications.

mass_concentration_combustor_exit(c_bc_e, ...)

Estimate nvPM mass concentration at the combustor exit.

mass_concentration_cruise_fox(c_bc_ref, ...)

Calculate the nvPM mass concentration for cruise conditions (c_bc_cru).

mass_concentration_engine_exit(c_bc_i, k_slm)

Estimate nvPM mass concentration at the engine exit.

mass_concentration_fox(fuel_flow, t_fl, afr)

Calculate the nvPM mass concentration for ground conditions (c_bc_ref).

mass_concentration_imfox(...)

Calculate nvPM mass concentration for ground and cruise conditions with ImFOX methodology.

mass_concentration_instrument_sampling_point(sn)

Estimate nvPM mass concentration at the instrument sampling point.

mass_ei_scope11(sn, afr, bypass_ratio)

Estimate nvPM mass emissions index at the four ICAO certification test points using SCOPE11.

mass_emissions_index_fox(air_pressure, ...)

Calculate the nvPM mass emissions index using the Formation and Oxidation Method (FOX).

mass_emissions_index_imfox(...)

Calculate the nvPM mass EI using the "Improved" Formation and Oxidation Method (ImFOX).

mass_fuel_composition_correction_meem(...)

Calculate fuel composition correction factor for nvPM mass emissions index.

mass_system_loss_correction_factor(c_bc_i, ...)

Estimate nvPM mass concentration/EI system loss correction factors.

number_ei_scope11(nvpm_ei_m_e, sn, ...[, ...])

Estimate nvPM number emissions index at the four ICAO certification test points using SCOPE11.

number_emissions_index_fractal_aggregates(...)

Estimate the nvPM number emission index using the fractal aggregates (FA) model.

number_fuel_composition_correction_meem(...)

Calculate fuel composition correction factor for nvPM number emissions index.

nvpm_emission_profiles_t4_t2(pressure_ratio, ...)

Create the nvPM number emissions index (EI) profile for the given engine type.

nvpm_mass_ei_pct_reduction_due_to_saf(...)

Adjust nvPM mass emissions index to account for the effects of sustainable aviation fuels.

nvpm_mass_emission_profiles_meem(combustor, ...)

Create the nvPM mass emissions index (EI) profile for the given engine type using MEEM2.

nvpm_number_ei_pct_reduction_due_to_saf(...)

Adjust nvPM number emissions index to account for the effects of sustainable aviation fuels.

nvpm_number_emission_profiles_meem(...[, ...])

Create the nvPM number emissions index (EI) profile for the given engine type using MEEM2.

turbine_inlet_temperature_imfox(afr)

Calculate the turbine inlet temperature using Abrahamson's method.

Classes

EDBnvpm(manufacturer, engine_name, ...)

A data class for EDB nvPM data.

class pycontrails.models.emissions.nvpm.EDBnvpm(manufacturer, engine_name, combustor, pressure_ratio, temp_min, temp_max, fuel_heat, ff_7, ff_30, ff_85, ff_100, nvpm_ei_m_7, nvpm_ei_m_30, nvpm_ei_m_85, nvpm_ei_m_100, nvpm_ei_n_7, nvpm_ei_n_30, nvpm_ei_n_85, nvpm_ei_n_100, nvpm_ei_m_use_max, nvpm_ei_m_no_sl_30, nvpm_ei_m_no_sl_85, nvpm_ei_m_no_sl_max, nvpm_ei_n_use_max, nvpm_ei_n_no_sl_30, nvpm_ei_n_no_sl_85, nvpm_ei_n_no_sl_max)

Bases: object

A data class for EDB nvPM data.

ENGINE IDENTIFICATION AND TYPE:

manufacturer: str

engine manufacturer

engine_name: str

name of engine

combustor: str

description of engine combustor

ENGINE CHARACTERISTICS:

pressure_ratio: float

engine pressure ratio

nvPM EMISSIONS:

nvpm_ei_m: EmissionsProfileInterpolator

non-volatile PM mass emissions index profile (mg/kg) vs. non-dimensionalized thrust setting (t4_t2)

nvpm_ei_n: EmissionsProfileInterpolator

non-volatile PM number emissions index profile (1/kg) vs. non-dimensionalized thrust setting (t4_t2)

combustor
engine_name
ff_100
ff_30
ff_7
ff_85
fuel_heat
manufacturer
nvpm_ei_m_100
nvpm_ei_m_30
nvpm_ei_m_7
nvpm_ei_m_85
nvpm_ei_m_no_sl_30
nvpm_ei_m_no_sl_85
nvpm_ei_m_no_sl_max
property nvpm_ei_m_t4_t2

Get the nvPM emissions index mass profile.

nvpm_ei_m_use_max
nvpm_ei_n_100
nvpm_ei_n_30
nvpm_ei_n_7
nvpm_ei_n_85
nvpm_ei_n_no_sl_30
nvpm_ei_n_no_sl_85
nvpm_ei_n_no_sl_max
property nvpm_ei_n_t4_t2

Get the nvPM emissions index number profile.

nvpm_ei_n_use_max
pressure_ratio
temp_max
temp_min
pycontrails.models.emissions.nvpm.air_density_combustor_exit(air_temperature, air_pressure, thrust_setting, afr, q_fuel, pressure_ratio, comp_efficiency=0.9)

Estimate air density at the combustor exit.

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

  • air_pressure (npt.NDArray[np.floating]) – Pressure altitude at each waypoint, [\(Pa\)]

  • thrust_setting (ArrayScalarLike) – Engine thrust setting, unitless

  • afr (npt.NDArray[np.floating]) – Air-to-fuel ratio, unitless

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

  • pressure_ratio (float) – Engine pressure ratio from the ICAO EDB

  • comp_efficiency (float) – Engine compressor efficiency, assumed to be 0.9

Returns:

npt.NDArray[np.floating] – Air density at the combustor exit, [\(kg \ m^{3}\)]

pycontrails.models.emissions.nvpm.air_to_fuel_ratio_imfox(thrust_setting)

Calculate the air-to-fuel ratio at cruise conditions via Abrahamson’s method.

See Eq. (11) in [Abrahamson et al., 2016].

Parameters:

thrust_setting (npt.NDArray[np.floating]) – Engine thrust setting, which is the fuel mass flow rate divided by the maximum fuel mass flow rate

Returns:

npt.NDArray[np.floating] – Air-to-fuel ratio at cruise conditions

References

pycontrails.models.emissions.nvpm.convert_nvpm_mass_concentration_to_ei(c_bc, q_exhaust)

Convert the nvPM mass concentration to an emissions index.

Parameters:
  • c_bc (npt.NDArray[np.floating]) – nvPM mass concentration, [\(mg m^{-3}\)]

  • q_exhaust (npt.NDArray[np.floating]) – Volume of exhaust gas per mass of fuel burnt, [\(m^{3}/kg_{fuel}\)]

Returns:

npt.NDArray[np.floating] – nvPM mass emissions index, [\(mg/kg_{fuel}\)]

References

pycontrails.models.emissions.nvpm.dopelheuer_lecht_scaling_factor(t_fl_cru, t_fl_ref, p_3_cru, p_3_ref, afr_cru, afr_ref)

Estimate scaling factor to convert reference nvPM mass concentration from ground to cruise.

Parameters:
  • t_fl_cru (npt.NDArray[np.floating]) – Flame temperature at cruise conditions, [\(K\)]

  • t_fl_ref (npt.NDArray[np.floating] | float) – Flame temperature at reference conditions, [\(K\)]

  • p_3_cru (npt.NDArray[np.floating]) – Combustor inlet pressure at cruise conditions, [\(Pa\)]

  • p_3_ref (npt.NDArray[np.floating] | float) – Combustor inlet pressure at reference conditions, [\(Pa\)]

  • afr_cru (npt.NDArray[np.floating]) – Air-to-fuel ratio at cruise conditions

  • afr_ref (npt.NDArray[np.floating] | float) – Air-to-fuel ratio at reference conditions

Returns:

npt.NDArray[np.floating] – Dopelheuer & Lecht scaling factor

References

pycontrails.models.emissions.nvpm.estimate_nvpm_meem(nvpm_ei_m_profile, nvpm_ei_n_profile, fuel_flow_per_engine, true_airspeed, air_pressure, air_temperature, ff_7, ff_100)

Calculate nvPM mass and number emissions index using the MEEM2 methodology.

Interpolate the non-volatile particulate matter (nvPM) mass and number emissions index from the emissions profile of a given engine type that is provided by the ICAO EDB.

Parameters:
  • nvpm_ei_m_profile (EmissionsProfileInterpolator) – MEEM2-derived nvPM mass emissions index versus the fuel flow for the selected engine See nvpm_mass_emission_profiles_meem().

  • nvpm_ei_n_profile (EmissionsProfileInterpolator) – MEEM2-derived nvPM number emissions index versus the fuel flow for the engine See nvpm_number_emission_profiles_meem().

  • fuel_flow_per_engine (npt.NDArray[np.floating]) – fuel mass flow rate per engine, [\(kg s^{-1}\)]

  • true_airspeed (npt.NDArray[np.floating]) – true airspeed for each waypoint, [\(m s^{-1}\)]

  • air_pressure (npt.NDArray[np.floating]) – pressure altitude at each waypoint, [\(Pa\)]

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

  • ff_7 (float) – ICAO EDB fuel flow at idle (7% power) for the selected engine, [\(kg s^{-1}\)]

  • ff_100 (float) – ICAO EDB fuel flow at take-off (100% power) for the selected engine, [\(kg s^{-1}\)]

Returns:

  • nvpm_ei_m (npt.NDArray[np.floating]) – nvPM mass emissions index, [\(kg/kg_{fuel}\)]

  • nvpm_ei_n (npt.NDArray[np.floating]) – nvPM number emissions index, [\(kg_{fuel}^{-1}\)]

References

# TODO: Add to bibliography - (Ahrens et al., 2025) https://doi.org/10.4271/2025-01-6000

pycontrails.models.emissions.nvpm.estimate_nvpm_t4_t2(edb_nvpm, true_airspeed, air_temperature, air_pressure, thrust_setting, q_fuel)

Calculate nvPM mass and number emissions index using the T4/T2 methodology.

Interpolate the non-volatile particulate matter (nvPM) mass and number emissions index from the emissions profile of a given engine type that is provided by the ICAO EDB.

The non-dimensional thrust setting (t4_t2) is clipped to the minimum and maximum t4_t2 values that is estimated from the four ICAO EDB datapoints to prevent extrapolating the nvPM values.

Parameters:
  • edb_nvpm (EDBnvpm) – EDB nvPM data

  • true_airspeed (npt.NDArray[np.floating]) – true airspeed for each waypoint, [\(m s^{-1}\)]

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

  • air_pressure (npt.NDArray[np.floating]) – pressure altitude at each waypoint, [\(Pa\)]

  • thrust_setting (npt.NDArray[np.floating]) – thrust setting

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

Returns:

  • nvpm_ei_m (npt.NDArray[np.floating]) – nvPM mass emissions index, [\(kg/kg_{fuel}\)]

  • nvpm_ei_n (npt.NDArray[np.floating]) – nvPM number emissions index, [\(kg_{fuel}^{-1}\)]

pycontrails.models.emissions.nvpm.exhaust_gas_volume_per_kg_fuel(afr, *, bypass_ratio=0.0)

Calculate the volume of exhaust gas per mass of fuel burnt.

Parameters:
  • afr (npt.NDArray[np.floating]) – Air-to-fuel ratio

  • bypass_ratio (float) – Engine bypass ratio

Returns:

npt.NDArray[np.floating] – Volume of exhaust gas per mass of fuel burnt, [\(m^{3}/kg_{fuel}\)]

References

# TODO: Add to bibliography - (Agarwal et al., 2019) https://doi.org/10.1021/acs.est.8b04060

pycontrails.models.emissions.nvpm.flame_temperature(t_3)

Calculate the flame temperature at the combustion chamber (t_fl).

Parameters:

t_3 (ArrayScalarLike) – Combustor inlet temperature, [\(K\)]

Returns:

ArrayScalarLike – Flame temperature at the combustion chamber, [\(K\)]

pycontrails.models.emissions.nvpm.geometric_mean_diameter_sac(air_pressure, air_temperature, true_airspeed, thrust_setting, pressure_ratio, q_fuel, *, comp_efficiency=0.9, delta_loss=5.75, cruise=True)

Calculate the nvPM GMD for singular annular combustor (SAC) engines.

The nvPM GMD (geometric mean diameter) is estimated using the non-dimensionalized engine thrust setting, the ratio of turbine inlet to the compressor inlet temperature (t4_t2).

Parameters:
  • air_pressure (npt.NDArray[np.floating]) – Pressure altitude at each waypoint, [\(Pa\)]

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

  • true_airspeed (npt.NDArray[np.floating]) – True airspeed for each waypoint, [\(m s^{-1}\)]

  • thrust_setting (npt.NDArray[np.floating]) – Engine thrust setting, which is the fuel mass flow rate divided by the maximum fuel mass flow rate

  • pressure_ratio (float) – Engine pressure ratio from the ICAO EDB

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

  • comp_efficiency (float) – Engine compressor efficiency (assumed to be 0.9)

  • delta_loss (float) – Correction factor accounting for particle line losses (assumed to be 5.75 nm), [\(nm\)]

  • cruise (bool) – Set to true when the aircraft is not on the ground.

Returns:

npt.NDArray[np.floating] – nvPM geometric mean diameter, [\(nm\)]

References

pycontrails.models.emissions.nvpm.geometric_mean_diameter_scope11(c_bc_c)

Estimate nvPM geometric mean diameter for SCOPE11 applications.

Parameters:

c_bc_c (npt.NDArray[np.floating]) – nvPM mass concentration at the combustor exit, [\(\mu g m^{-3}] See :func:`mass_concentration_combustor_exit\)

Returns:

npt.NDArray[np.floating] – nvPM geometric mean diameter, [\(nm\)]

pycontrails.models.emissions.nvpm.mass_concentration_combustor_exit(c_bc_e, air_temperature, air_pressure, thrust_setting, afr, q_fuel, bypass_ratio, pressure_ratio, comp_efficiency=0.9)

Estimate nvPM mass concentration at the combustor exit.

Parameters:
  • c_bc_e (npt.NDArray[np.floating]) – nvPM mass concentration at the engine exit plane, [\(\mu g m^{-3}] See :func:`mass_concentration_engine_exit\)

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

  • air_pressure (npt.NDArray[np.floating]) – Pressure altitude at each waypoint, [\(Pa\)]

  • thrust_setting (ArrayScalarLike) – Engine thrust setting, unitless

  • afr (npt.NDArray[np.floating]) – Air-to-fuel ratio, unitless

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

  • bypass_ratio (float) – Engine bypass ratio from the ICAO EDB

  • pressure_ratio (float) – Engine pressure ratio from the ICAO EDB

  • comp_efficiency (float) – Engine compressor efficiency, assumed to be 0.9

Returns:

npt.NDArray[np.floating] – nvPM mass concentration at the combustor exit, [:math:`mu g m^{-3}]

pycontrails.models.emissions.nvpm.mass_concentration_cruise_fox(c_bc_ref, t_fl_cru, t_fl_ref, p_3_cru, p_3_ref, afr_cru, afr_ref)

Calculate the nvPM mass concentration for cruise conditions (c_bc_cru).

This quantity is computed at the instrument sampling point without correcting for particle line losses.

Parameters:
  • c_bc_ref (npt.NDArray[np.floating]) – nvPM mass concentration at reference conditions, [\(mg m^{-3}\)]

  • t_fl_cru (npt.NDArray[np.floating]) – Flame temperature at cruise conditions, [\(K\)]

  • t_fl_ref (npt.NDArray[np.floating] | float) – Flame temperature at reference conditions, [\(K\)]

  • p_3_cru (npt.NDArray[np.floating]) – Combustor inlet pressure at cruise conditions, [\(Pa\)]

  • p_3_ref (npt.NDArray[np.floating] | float) – Combustor inlet pressure at reference conditions, [\(Pa\)]

  • afr_cru (npt.NDArray[np.floating]) – Air-to-fuel ratio at cruise conditions

  • afr_ref (npt.NDArray[np.floating] | float) – Air-to-fuel ratio at reference conditions

Returns:

npt.NDArray[np.floating] – nvPM mass concentration for cruise conditions, [\(mg m^{-3}\)]

pycontrails.models.emissions.nvpm.mass_concentration_engine_exit(c_bc_i, k_slm)

Estimate nvPM mass concentration at the engine exit.

Parameters:
  • c_bc_i (npt.NDArray[np.floating]) – nvPM mass concentration at the instrument sampling point, [\(\mu g m^{-3}] See :func:`mass_concentration_instrument_sampling_point\)

  • k_slm (npt.NDArray[np.floating]) – nvPM mass concentration/EI system loss correction factor See mass_system_loss_correction_factor()

Returns:

npt.NDArray[np.floating] – nvPM mass concentration at the engine exit, [:math:`mu g m^{-3}]

pycontrails.models.emissions.nvpm.mass_concentration_fox(fuel_flow, t_fl, afr)

Calculate the nvPM mass concentration for ground conditions (c_bc_ref).

This quantity is computed at the instrument sampling point without correcting for particle line losses.

Parameters:
  • fuel_flow (npt.NDArray[np.floating]) – Fuel mass flow rate, [\(kg s^{-1}\)]

  • t_fl (npt.NDArray[np.floating] | float) – Flame temperature at the combustion chamber, [\(K\)]

  • afr (npt.NDArray[np.floating] | float) – Air-to-fuel ratio

Returns:

npt.NDArray[np.floating] – nvPM mass concentration for ground conditions, [\(mg m^{-3}\)]

pycontrails.models.emissions.nvpm.mass_concentration_imfox(fuel_flow_per_engine, afr, t_4, fuel_hydrogen)

Calculate nvPM mass concentration for ground and cruise conditions with ImFOX methodology.

This quantity is computed at the instrument sampling point without correcting for particle line losses.

Parameters:
  • fuel_flow_per_engine (npt.NDArray[np.floating]) – fuel mass flow rate per engine, [\(kg s^{-1}\)]

  • afr (npt.NDArray[np.floating]) – air-to-fuel ratio

  • t_4 (npt.NDArray[np.floating]) – turbine inlet temperature, [\(K\)]

  • fuel_hydrogen (float) – percentage of hydrogen mass content in the fuel (13.8% for conventional Jet A-1 fuel)

Returns:

npt.NDArray[np.floating] – nvPM mass concentration, [\(mg m^{-3}\)]

pycontrails.models.emissions.nvpm.mass_concentration_instrument_sampling_point(sn)

Estimate nvPM mass concentration at the instrument sampling point.

Parameters:

sn (npt.NDArray[np.floating]) – Smoke number, unitless

Returns:

npt.NDArray[np.floating] – nvPM mass concentration at the instrument sampling point, [:math:`mu g m^{-3}]

pycontrails.models.emissions.nvpm.mass_ei_scope11(sn, afr, bypass_ratio)

Estimate nvPM mass emissions index at the four ICAO certification test points using SCOPE11.

Parameters:
  • sn (npt.NDArray[np.floating]) – Smoke number, unitless

  • afr (npt.NDArray[np.floating]) – Air-to-fuel ratio, unitless (106 at idle, 83 at approach, 51 at climb-out, and 45 at take-off)

  • bypass_ratio (float) – Engine bypass ratio from the ICAO EDB

Returns:

npt.NDArray[np.floating] – nvPM mass emissions index at the engine exit, [\(kg \ kg_{fuel}^{-1}\)]

References

# TODO: Add to bibliography - (Agarwal et al., 2019) https://doi.org/10.1021/acs.est.8b04060

pycontrails.models.emissions.nvpm.mass_emissions_index_fox(air_pressure, air_temperature, true_airspeed, fuel_flow_per_engine, thrust_setting, pressure_ratio, *, comp_efficiency=0.9)

Calculate the nvPM mass emissions index using the Formation and Oxidation Method (FOX).

Parameters:
  • air_pressure (npt.NDArray[np.floating]) – Pressure altitude at each waypoint, [\(Pa\)]

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

  • true_airspeed (npt.NDArray[np.floating]) – True airspeed for each waypoint, [\(m s^{-1}\)]

  • fuel_flow_per_engine (npt.NDArray[np.floating]) – Fuel mass flow rate per engine, [\(kg s^{-1}\)]

  • thrust_setting (npt.NDArray[np.floating]) – Engine thrust setting, which is the fuel mass flow rate divided by the maximum fuel mass flow rate

  • pressure_ratio (float) – Engine pressure ratio from the ICAO EDB

  • comp_efficiency (float) – Engine compressor efficiency, assumed to be 0.9

Returns:

npt.NDArray[np.floating] – nvPM mass emissions index, [\(mg \ kg_{fuel}^{-1}\)]

References

pycontrails.models.emissions.nvpm.mass_emissions_index_imfox(fuel_flow_per_engine, thrust_setting, fuel_hydrogen)

Calculate the nvPM mass EI using the “Improved” Formation and Oxidation Method (ImFOX).

Parameters:
  • fuel_flow_per_engine (npt.NDArray[np.floating]) – Fuel mass flow rate per engine, [\(kg s^{-1}\)]

  • thrust_setting (npt.NDArray[np.floating]) – Engine thrust setting, which is the fuel mass flow rate divided by the maximum fuel mass flow rate

  • fuel_hydrogen (float) – Percentage of hydrogen mass content in the fuel (13.8% for conventional Jet A-1 fuel)

Returns:

npt.NDArray[np.floating] – nvPM mass emissions index, [\(mg \ kg_{fuel}^{-1}\)]

References

pycontrails.models.emissions.nvpm.mass_fuel_composition_correction_meem(hydrogen_content, thrust_setting)

Calculate fuel composition correction factor for nvPM mass emissions index.

Parameters:
  • hydrogen_content (float) – The percentage of hydrogen mass content in the fuel.

  • thrust_setting (ArrayScalarLike) – Engine thrust setting, unitless

Returns:

npt.NDArray[np.floating] – nvPM mass fuel composition correction factor

pycontrails.models.emissions.nvpm.mass_system_loss_correction_factor(c_bc_i, bypass_ratio)

Estimate nvPM mass concentration/EI system loss correction factors.

Parameters:
  • c_bc_i (npt.NDArray[np.floating]) – nvPM mass concentration at the instrument sampling point, [\(\mu g m^{-3}] See :func:`mass_concentration_instrument_sampling_point\)

  • bypass_ratio (float) – Engine bypass ratio from the ICAO EDB

Returns:

npt.NDArray[np.floating] – nvPM mass concentration/EI system loss correction factor.

pycontrails.models.emissions.nvpm.number_ei_scope11(nvpm_ei_m_e, sn, air_temperature, air_pressure, thrust_setting, afr, q_fuel, bypass_ratio, pressure_ratio, comp_efficiency=0.9)

Estimate nvPM number emissions index at the four ICAO certification test points using SCOPE11.

Parameters:
  • nvpm_ei_m_e (npt.NDArray[np.floating]) – nvPM mass emissions index at the engine exit, [\(kg \ kg_{fuel}^{-1}\)] See estimate_nvpm_mass_ei_scope11()

  • sn (npt.NDArray[np.floating]) – Smoke number, unitless

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

  • air_pressure (npt.NDArray[np.floating]) – Pressure altitude at each waypoint, [\(Pa\)]

  • thrust_setting (ArrayScalarLike) – Engine thrust setting, unitless

  • afr (npt.NDArray[np.floating]) – Air-to-fuel ratio, unitless (106 at idle, 83 at approach, 51 at climb-out, and 45 at take-off)

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

  • bypass_ratio (float) – Engine bypass ratio from the ICAO EDB

  • pressure_ratio (float) – Engine pressure ratio from the ICAO EDB

  • comp_efficiency (float) – Engine compressor efficiency, assumed to be 0.9

Returns:

npt.NDArray[np.floating] – nvPM number emissions index, [\(kg_{fuel}^{-1}\)]

pycontrails.models.emissions.nvpm.number_emissions_index_fractal_aggregates(nvpm_ei_m, gmd, *, gsd=np.float32(1.8), rho_bc=np.float32(1770.0), k_tem=np.float32(1.621e-05), d_tem=np.float32(0.39), d_fm=np.float32(2.76))

Estimate the nvPM number emission index using the fractal aggregates (FA) model.

The FA model estimates the number emissions index from the mass emissions index, particle size distribution, and morphology.

Parameters:
  • nvpm_ei_m (npt.NDArray[np.floating]) – nvPM mass emissions index, [\(kg/kg_{fuel}\)]

  • gmd (npt.NDArray[np.floating]) – nvPM geometric mean diameter, [\(m\)]

  • gsd (float) – nvPM geometric standard deviation (assumed to be 1.80)

  • rho_bc (float) – nvPM material density (1770 kg/m**3), [\(kg m^{-3}\)]

  • k_tem (float) – Transmission electron microscopy prefactor coefficient (assumed to be 1.621e-5)

  • d_tem (float) – Transmission electron microscopy exponent coefficient (assumed to be 0.39)

  • d_fm (float) – Mass-mobility exponent (assumed to be 2.76)

Returns:

npt.NDArray[np.floating] – nvPM number emissions index, [\(kg_{fuel}^{-1}\)]

References

pycontrails.models.emissions.nvpm.number_fuel_composition_correction_meem(hydrogen_content, thrust_setting)

Calculate fuel composition correction factor for nvPM number emissions index.

Parameters:
  • hydrogen_content (float) – The percentage of hydrogen mass content in the fuel.

  • thrust_setting (ArrayScalarLike) – Engine thrust setting, unitless

Returns:

npt.NDArray[np.floating] – nvPM number fuel composition correction factor

pycontrails.models.emissions.nvpm.nvpm_emission_profiles_t4_t2(pressure_ratio, combustor, temp_min, temp_max, q_fuel, ff_7, ff_30, ff_85, ff_100, nvpm_ei_m_7, nvpm_ei_m_30, nvpm_ei_m_85, nvpm_ei_m_100, nvpm_ei_n_7, nvpm_ei_n_30, nvpm_ei_n_85, nvpm_ei_n_100)

Create the nvPM number emissions index (EI) profile for the given engine type.

Parameters:
  • pressure_ratio (float) – Engine pressure ratio, unitless

  • combustor (str) – Engine combustor type provided by the ICAO EDB column Combustor Description.

  • temp_min (float) – Minimum temperature, provided by the ICAO EDB column Ambient Temp Min (K), [\(K\)]

  • temp_max (float) – Maximum temperature, provided by the ICAO EDB column Ambient Temp Max (K), [\(K\)]

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

  • ff_7 (float) – ICAO EDB fuel mass flow rate at idle conditions (7% power), [\(kg s^{-1}\)]

  • ff_30 (float) – ICAO EDB fuel mass flow rate at approach (30% power), [\(kg s^{-1}\)]

  • ff_85 (float) – ICAO EDB fuel mass flow rate at climb out (85% power), [\(kg s^{-1}\)]

  • ff_100 (float) – ICAO EDB fuel mass flow rate at take-off (100% power), [\(kg s^{-1}\)]

  • nvpm_ei_n_7 (float) – ICAO EDB nvPM number emissions index at idle conditions (7% power), [\(kg_{fuel}^{-1}\)]

  • nvpm_ei_n_30 (float) – ICAO EDB nvPM number emissions index at approach (30% power), [\(kg_{fuel}^{-1}\)]

  • nvpm_ei_n_85 (float) – ICAO EDB nvPM number emissions index at climb out (85% power), [\(kg_{fuel}^{-1}\)]

  • nvpm_ei_n_100 (float) – ICAO EDB nvPM number emissions index at take-off (100% power), [\(kg_{fuel}^{-1}\)]

  • nvpm_ei_m_7 (float) – ICAO EDB nvPM mass emissions index at idle conditions (7% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_30 (float) – ICAO EDB nvPM mass emissions index at approach (30% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_85 (float) – ICAO EDB nvPM mass emissions index at climb out (85% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_100 (float) – ICAO EDB nvPM mass emissions index at take-off (100% power), [\(kg/kg_{fuel}\)]

Returns:

tuple[EmissionsProfileInterpolator, EmissionsProfileInterpolator] – nvPM mass and number emissions index versus the fuel mass flow rate for a given engine type

pycontrails.models.emissions.nvpm.nvpm_mass_ei_pct_reduction_due_to_saf(hydrogen_content, thrust_setting)

Adjust nvPM mass emissions index to account for the effects of sustainable aviation fuels.

For fuel with hydrogen mass content > 14.3, the adjustment factor is adopted from Teoh et al. (2022), which was used to calculate the change in nvPM EIn.

Parameters:
  • hydrogen_content (float) – The percentage of hydrogen mass content in the fuel.

  • thrust_setting (npt.NDArray[np.floating]) – Engine thrust setting, where the equivalent fuel mass flow rate per engine at sea level, \([0 - 1]\).

Returns:

npt.NDArray[np.floating] – Percentage reduction in nvPM number emissions index

References

pycontrails.models.emissions.nvpm.nvpm_mass_emission_profiles_meem(combustor, hydrogen_content, ff_7, ff_30, ff_85, ff_100, nvpm_ei_m_7, nvpm_ei_m_30, nvpm_ei_m_85, nvpm_ei_m_100, fifth_data_point_mass=False, nvpm_ei_m_30_no_sl=None, nvpm_ei_m_85_no_sl=None, nvpm_ei_m_max_no_sl=None)

Create the nvPM mass emissions index (EI) profile for the given engine type using MEEM2.

Parameters:
  • combustor (str) – Engine combustor type provided by the ICAO EDB column Combustor Description.

  • hydrogen_content (float) – The percentage of hydrogen mass content in the fuel.

  • ff_7 (float) – ICAO EDB fuel mass flow rate at idle conditions (7% power), [\(kg s^{-1}\)]

  • ff_30 (float) – ICAO EDB fuel mass flow rate at approach (30% power), [\(kg s^{-1}\)]

  • ff_85 (float) – ICAO EDB fuel mass flow rate at climb out (85% power), [\(kg s^{-1}\)]

  • ff_100 (float) – ICAO EDB fuel mass flow rate at take-off (100% power), [\(kg s^{-1}\)]

  • nvpm_ei_m_7 (float) – ICAO EDB loss-corrected nvPM mass EI at idle (7% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_30 (float) – ICAO EDB loss-corrected nvPM mass EI at approach (30% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_85 (float) – ICAO EDB loss-corrected nvPM mass EI at climb out (85% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_100 (float) – ICAO EDB loss-corrected nvPM mass EI at take-off (100% power), [\(kg/kg_{fuel}\)]

  • fifth_data_point_mass (bool,) – Does the maximum nvPM EI mass occur between 30% and 85% of fuel flow?

  • nvpm_ei_m_30_no_sl (float | None,) – ICAO EDB nvPM mass EI at approach (30% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_85_no_sl (float | None,) – ICAO EDB nvPM mass EI at climb out (85% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_m_max_no_sl (float | None,) – ICAO EDB maximum nvPM mass EI, [\(kg/kg_{fuel}\)]

Returns:

EmissionsProfileInterpolator – nvPM mass emissions index versus the fuel mass flow rate for a given engine type

References

# TODO: Add to bibliography - (Ahrens et al., 2025) https://doi.org/10.4271/2025-01-6000

pycontrails.models.emissions.nvpm.nvpm_number_ei_pct_reduction_due_to_saf(hydrogen_content, thrust_setting)

Adjust nvPM number emissions index to account for the effects of sustainable aviation fuels.

Parameters:
  • hydrogen_content (float) – The percentage of hydrogen mass content in the fuel.

  • thrust_setting (npt.NDArray[np.floating]) – Engine thrust setting, where the equivalent fuel mass flow rate per engine at sea level, \([0 - 1]\).

Returns:

npt.NDArray[np.floating] – Percentage reduction in nvPM number emissions index

References

pycontrails.models.emissions.nvpm.nvpm_number_emission_profiles_meem(combustor, hydrogen_content, ff_7, ff_30, ff_85, ff_100, nvpm_ei_n_7, nvpm_ei_n_30, nvpm_ei_n_85, nvpm_ei_n_100, fifth_data_point_number=False, nvpm_ei_n_30_no_sl=None, nvpm_ei_n_85_no_sl=None, nvpm_ei_n_max_no_sl=None)

Create the nvPM number emissions index (EI) profile for the given engine type using MEEM2.

Parameters:
  • combustor (str) – Engine combustor type provided by the ICAO EDB column Combustor Description.

  • hydrogen_content (float) – The percentage of hydrogen mass content in the fuel.

  • ff_7 (float) – ICAO EDB fuel mass flow rate at idle conditions (7% power), [\(kg s^{-1}\)]

  • ff_30 (float) – ICAO EDB fuel mass flow rate at approach (30% power), [\(kg s^{-1}\)]

  • ff_85 (float) – ICAO EDB fuel mass flow rate at climb out (85% power), [\(kg s^{-1}\)]

  • ff_100 (float) – ICAO EDB fuel mass flow rate at take-off (100% power), [\(kg s^{-1}\)]

  • nvpm_ei_n_7 (float) – ICAO EDB loss-corrected nvPM number EI at idle (7% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_n_30 (float) – ICAO EDB loss-corrected nvPM number EI at approach (30% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_n_85 (float) – ICAO EDB loss-corrected nvPM number EI at climb out (85% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_n_100 (float) – ICAO EDB loss-corrected nvPM number EI at take-off (100% power), [\(kg/kg_{fuel}\)]

  • fifth_data_point_number (bool,) – Does the maximum nvPM EI number occur between 30% and 85% of fuel flow?

  • nvpm_ei_n_30_no_sl (float | None,) – ICAO EDB nvPM number EI at approach (30% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_n_85_no_sl (float | None,) – ICAO EDB nvPM number EI at climb out (85% power), [\(kg/kg_{fuel}\)]

  • nvpm_ei_n_max_no_sl (float | None,) – ICAO EDB maximum nvPM number EI, [\(kg/kg_{fuel}\)]

Returns:

EmissionsProfileInterpolator – nvPM number emissions index versus the fuel mass flow rate for a given engine type

References

# TODO: Add to bibliography - (Ahrens et al., 2025) https://doi.org/10.4271/2025-01-6000

pycontrails.models.emissions.nvpm.turbine_inlet_temperature_imfox(afr)

Calculate the turbine inlet temperature using Abrahamson’s method.

See Eq. (13) in [Abrahamson et al., 2016].

Parameters:

afr (npt.NDArray[np.floating]) – air-to-fuel ratio at cruise conditions

Returns:

npt.NDArray[np.floating] – turbine inlet temperature, [\(K\)]

References