pycontrails.models.cocip.radiative_forcing

Module for calculating radiative forcing of contrail cirrus.

References

Functions

albedo(sdr, rsr)

Calculate albedo along contrail waypoint.

contrail_albedo(tau_contrail, mue, r_eff_um, ...)

Calculate the contrail albedo, alpha_c.

contrail_contrail_overlap_radiative_effects(...)

Calculate radiative properties after accounting for contrail overlapping.

contrail_effective_emissivity(r_eff_um, delta_lr)

Calculate the effective emissivity of the contrail, f_lw.

effective_radius_by_habit(r_vol_um, habit_idx)

Calculate the effective radius r_eff_um via the mean ice particle radius and habit type.

effective_radius_droxtal(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a droxtal particle habit.

effective_radius_hollow_column(r_vol_um)

Calculate the effective radius of ice particles assuming a hollow column particle habit.

effective_radius_myhre(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a sphere particle habit.

effective_radius_plate(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a plate particle habit.

effective_radius_rosette(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a rosette particle habit.

effective_radius_rough_aggregate(r_vol_um)

Calculate the effective radius of ice particles assuming a rough aggregate particle habit.

effective_radius_solid_column(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a solid column particle habit.

effective_radius_sphere(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a sphere particle habit.

effective_tau_cirrus(tau_cirrus, mue, ...)

Calculate the effective optical depth of natural cirrus above the contrail, e_sw.

habit_weight_regime_idx(r_vol_um, ...)

Determine regime of ice particle habits based on contrail ice particle volume mean radius.

habit_weights(r_vol_um, habit_distributions, ...)

Assign weights to different ice particle habits for each waypoint.

longwave_radiative_forcing(r_vol_um, olr, ...)

Calculate the local contrail longwave radiative forcing (\(RF_{LW}\)).

net_radiative_forcing(rf_lw, rf_sw)

Calculate the local contrail net radiative forcing (rf_net).

olr_reduction_natural_cirrus(tau_cirrus, ...)

Calculate reduction in outgoing longwave radiation (OLR) due to the presence of natural cirrus.

shortwave_radiative_forcing(r_vol_um, sdr, ...)

Calculate the local contrail shortwave radiative forcing (\(RF_{SW}\)).

Classes

RFConstants()

Constants that are used to calculate the local contrail radiative forcing.

class pycontrails.models.cocip.radiative_forcing.RFConstants

Bases: object

Constants that are used to calculate the local contrail radiative forcing.

See Table 1 of [Schumann et al., 2012].

Each coefficient has 8 elements, one corresponding to each contrail ice particle habit (shape):

[
    Sphere,
    Solid column,
    Hollow column,
    Rough aggregate,
    Rosette-6,
    Plate,
    Droxtal,
    Myhre,
]

For each waypoint, the distinct mix of ice particle habits are approximated using the mean contrail ice particle radius (r_vol_um) relative to radius_threshold_um.

For example:

  • if r_vol_um for a waypoint < 5 um, the mix of ice particle habits will be 100% droxtals.

  • if r_vol_um for a waypoint between 5 and 9.5 um, the mix of ice particle habits will be 30% solid columns, 70% droxtals.

See Table 2 from [Schumann et al., 2011].

References

A_mu = array([0.361226, 0.294072, 0.343894, 0.317866, 0.337227, 0.310978,        0.342593, 0.269179])

\(A_{\mu}\) in Eq. (6) in [Schumann et al., 2012]

B_mu = array([1.67592, 1.55687, 1.71065, 1.55843, 1.70782, 1.71789, 1.56399,        1.59015])

Approximate the SZA-dependent contrail sideward scattering \(B_{\mu}\) in Eq. (10) in [Schumann et al., 2012]

C_mu = array([0.7093  , 0.678016, 0.687546, 0.675315, 0.712041, 0.713317,        0.660267, 0.545716])

\(C_{\mu}\) in Eq. (6) in [Schumann et al., 2012]

F_r = array([0.511852, 0.576911, 0.597351, 0.22575 , 0.550734, 0.817858,        0.249004, 0.      ])

Approximates the effective contrail optical depth \(F_r\) in Eq. (7) and (8) in [Schumann et al., 2012]

T_0 = array([152.237, 152.724, 152.923, 152.36 , 151.879, 152.318, 165.692,        153.073])

Approximates the temperature of the atmosphere without contrails \(T_{0}\) in Eq. (2) in [Schumann et al., 2012]

delta_lc = array([0.159942 , 0.0958129, 0.092485 , 0.0462023, 0.132925 , 0.0870067,        0.0626339, 0.0665289])

Optical depth scaling factor for reduction of the OLR at the contrail level due to existing cirrus above the contrail \(\delta_{lc} in Eq. (4) in :cite:`schumannParametricRadiativeForcing2012\)

delta_lr = array([0.211276, 0.341194, 0.325496, 0.255921, 0.170265, 1.65441 ,        0.201949, 0.      ])

Effective radius scaling factor for optical properties (extinction relative to scattering) \(\delta_{lr} in Eq. (3) in :cite:`schumannParametricRadiativeForcing2012\)

delta_sc = array([0.157017, 0.143274, 0.167995, 0.148547, 0.173036, 0.162442,        0.171855, 0.213488])

Account for the optical depth of natural cirrus above the contrail \(\delta_{sc}\) in Eq. (11) in [Schumann et al., 2012]

delta_sc_aps = array([0.229574, 0.197611, 0.245036, 0.204875, 0.248328, 0.254029,        0.244051, 0.302246])
delta_sr = array([0.149851 , 0.025427 , 0.0238836, 0.0463724, 0.0478892, 0.0700234,        0.0517942, 0.       ])

Approximates the effective contrail optical depth \(delta_sr\) in Eq. (7) and (8) in [Schumann et al., 2012]

delta_t = array([0.940846, 0.808397, 0.736222, 0.675591, 0.748757, 0.708515,        0.927592, 0.795527])

Approximate the effective emmissivity factor \(\delta_{\tau} in :cite:`schumannParametricRadiativeForcing2012\)

gamma_lower = array([0.323166, 0.392598, 0.356189, 0.34504 , 0.407515, 0.523604,        0.310853, 0.274741])

Approximates the contrail reflectances \(\gamma\) in Eq. (9) in [Schumann et al., 2012]

gamma_upper = array([0.241507, 0.347023, 0.288452, 0.296813, 0.327857, 0.43756 ,        0.27471 , 0.208154])

Approximates the contrail reflectances \(\Gamma\) in Eq. (9) in [Schumann et al., 2012]

k_t = array([1.93466, 1.95456, 1.95994, 1.95906, 1.94397, 1.95123, 2.30363,        1.94611])

Linear approximation of Stefan-Boltzmann Law \(k_t\) in Eq. (2) in [Schumann et al., 2012]

t_a = array([0.879119, 0.901701, 0.881812, 0.899144, 0.879896, 0.883212,        0.899096, 1.00744 ])

Approximates the dependence on the effective albedo \(t_a\): Eq. (5) in [Schumann et al., 2012]

pycontrails.models.cocip.radiative_forcing.albedo(sdr, rsr)

Calculate albedo along contrail waypoint.

Albedo, the diffuse reflection of solar radiation out of the total solar radiation, is computed based on the solar direct radiation (sdr) and reflected solar radiation (rsr).

Output values range between 0 (corresponding to a black body that absorbs all incident radiation) and 1 (a body that reflects all incident radiation).

Parameters:
  • sdr (npt.NDArray[np.float64]) – Solar direct radiation, [\(W m^{-2}\)]

  • rsr (npt.NDArray[np.float64]) – Reflected solar radiation, [\(W m^{-2}\)]

Returns:

npt.NDArray[np.float64] – Albedo value, [\([0 - 1]\)]

pycontrails.models.cocip.radiative_forcing.contrail_albedo(tau_contrail, mue, r_eff_um, A_mu, B_mu, C_mu, delta_sr, F_r, gamma_lower, gamma_upper)

Calculate the contrail albedo, alpha_c.

Refer to Eq. (6) of Schumann et al. (2012),

Parameters:
  • tau_contrail (npt.NDArray[np.float64]) – Contrail optical depth for each waypoint

  • mue (npt.NDArray[np.float64]) – Cosine of the solar zenith angle (theta), mue = cos(theta) = sdr/sd0

  • r_eff_um (npt.NDArray[np.float64]) – Effective radius for each waypoint, n_waypoints x 8 (habit) columns, [\(\mu m\)] See effective_radius_habit().

  • A_mu (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the albedo of the contrail

  • B_mu (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the SZA-dependent contrail sideward scattering

  • C_mu (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the albedo of the contrail

  • delta_sr (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the effective contrail optical depth

  • F_r (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the effective contrail optical depth

  • gamma_lower (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the contrail reflectances

  • gamma_upper (npt.NDArray[np.float64]) – Habit-specific parameter to approximate the contrail reflectances

Returns:

npt.NDArray[np.float64] – Contrail albedo for each waypoint and ice particle habit

pycontrails.models.cocip.radiative_forcing.contrail_contrail_overlap_radiative_effects(contrails, habit_distributions, radius_threshold_um, *, min_altitude_m=6000.0, max_altitude_m=13000.0, dz_overlap_m=500.0, spatial_grid_res=0.25)

Calculate radiative properties after accounting for contrail overlapping.

This function mutates the contrails parameter.

Parameters:
  • contrails (GeoVectorDataset) – Contrail waypoints at a given time. Must include the following variables: - segment_length - width - r_ice_vol - tau_contrail - tau_cirrus - air_temperature - sdr - rsr - olr

  • habit_distributions (npt.NDArray[np.float64]) – Habit weight distributions. See CocipParams.habit_distributions

  • radius_threshold_um (npt.NDArray[np.float64]) – Radius thresholds for habit distributions. See CocipParams.radius_threshold_um

  • min_altitude_m (float) – Minimum altitude domain in simulation, [\(m\)] See CocipParams.min_altitude_m

  • max_altitude_m – Maximum altitude domain in simulation, [\(m\)] See CocipParams.min_altitude_m

  • dz_overlap_m (float) – Altitude interval used to segment contrail waypoints, [\(m\)] See CocipParams.dz_overlap_m

  • spatial_grid_res (float) – Spatial grid resolution, [\(\deg\)]

Returns:

GeoVectorDataset – Contrail waypoints at a given time with additional variables attached, including - rsr_overlap - olr_overlap - tau_cirrus_overlap - rf_sw_overlap - rf_lw_overlap - rf_net_overlap

References

  • Schumann et al. (2021) Air traffic and contrail changes over Europe during COVID-19:

    A model study, Atmos. Chem. Phys., 21, 7429–7450, https://doi.org/10.5194/ACP-21-7429-2021.

  • Teoh et al. (2023) Global aviation contrail climate effects from 2019 to 2021.

Notes

  • The radiative effects of contrail-contrail overlapping is approximated by changing the background RSR and OLR fields, and the overlying cirrus optical depth above the contrail.

  • All contrail segments within each altitude interval are treated as one contrail layer, where they do not overlap. Contrail layers are processed starting from the bottom to the top.

  • Refer to the Supporting Information (S4.3) of Teoh et al. (2023)

pycontrails.models.cocip.radiative_forcing.contrail_effective_emissivity(r_eff_um, delta_lr)

Calculate the effective emissivity of the contrail, f_lw.

Refer to Eq. (3) of Schumann et al. (2012).

Parameters:
  • r_eff_um (npt.NDArray[np.float64]) – Effective radius for each waypoint, n_waypoints x 8 (habit) columns, [\(\mu m\)] See effective_radius_habit().

  • delta_lr (npt.NDArray[np.float64]) – Habit specific parameter to approximate the effective emissivity of the contrail.

Returns:

npt.NDArray[np.float64] – Effective emissivity of the contrail

pycontrails.models.cocip.radiative_forcing.effective_radius_by_habit(r_vol_um, habit_idx)

Calculate the effective radius r_eff_um via the mean ice particle radius and habit type.

The habit_idx corresponds to the habit types in rf_const.habits. Each habit type has a specific parameterization to calculate r_eff_um based on r_vol_um. derived from [Schumann et al., 2011].

Parameters:
  • r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

  • habit_idx (npt.NDArray[np.intp]) – Habit type index for the contrail ice particle, corresponding to the habits in rf_const.habits.

Returns:

npt.NDArray[np.float64] – Effective radius of ice particles for each combination of r_vol_um and habit_idx, [\(\mu m\)]

References

pycontrails.models.cocip.radiative_forcing.effective_radius_droxtal(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a droxtal particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_hollow_column(r_vol_um)

Calculate the effective radius of ice particles assuming a hollow column particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_myhre(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a sphere particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_plate(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a plate particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_rosette(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a rosette particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_rough_aggregate(r_vol_um)

Calculate the effective radius of ice particles assuming a rough aggregate particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_solid_column(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a solid column particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_radius_sphere(r_vol_um)

Calculate the effective radius of contrail ice particles assuming a sphere particle habit.

Parameters:

r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

Returns:

npt.NDArray[np.float64] – Effective radius, [\(\mu m\)]

pycontrails.models.cocip.radiative_forcing.effective_tau_cirrus(tau_cirrus, mue, delta_sc, delta_sc_aps)

Calculate the effective optical depth of natural cirrus above the contrail, e_sw.

Refer to Eq. (11) of [Schumann et al., 2012]. See Notes for a correction to the equation.

Parameters:
  • tau_cirrus (npt.NDArray[np.float64]) – Optical depth of numerical weather prediction (NWP) cirrus above the contrail for each waypoint.

  • mue (npt.NDArray[np.float64]) – Cosine of the solar zenith angle (theta), mue = cos(theta) = sdr/sd0

  • delta_sc (npt.NDArray[np.float64]) – Habit-specific parameter to account for the optical depth of natural cirrus above the contrail

  • delta_sc_aps (npt.NDArray[np.float64]) – Habit-specific parameter to account for the optical depth of natural cirrus above the contrail

Returns:

npt.NDArray[np.float64] – Effective optical depth of natural cirrus above the contrail, n_waypoints x 8 (habit) columns.

Notes

  • In a personal correspondence, Dr. Schumann identified a print error in Eq. (11) in [Schumann et al., 2012], where the positions of delta_sc_aps and delta_sc should be swapped. The correct function is provided below.

pycontrails.models.cocip.radiative_forcing.habit_weight_regime_idx(r_vol_um, radius_threshold_um)

Determine regime of ice particle habits based on contrail ice particle volume mean radius.

Parameters:
  • r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

  • radius_threshold_um (npt.NDArray[np.float64]) – Radius thresholds for habit distributions. See CocipParams.radius_threshold_um

Returns:

npt.NDArray[np.intp] – Row index of the habit distribution in array CocipParams().habit_distributions

pycontrails.models.cocip.radiative_forcing.habit_weights(r_vol_um, habit_distributions, radius_threshold_um)

Assign weights to different ice particle habits for each waypoint.

For each waypoint, the distinct mix of ice particle habits are approximated using the mean contrail ice particle radius (r_vol_um) binned by radius_threshold_um.

For example:

  • For waypoints with r_vol_um < 5 um, the mix of ice particle habits will be from Group 1 (100% Droxtals, refer to CocipParams().habit_distributions).

  • For waypoints with 5 um <= r_vol_um < 9.5 um, the mix of ice particle habits will be from Group 2 (30% solid columns, 70% droxtals)

Parameters:
  • r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

  • habit_distributions (npt.NDArray[np.float64]) – Habit weight distributions. See CocipParams().habit_distributions

  • radius_threshold_um (npt.NDArray[np.float64]) – Radius thresholds for habit distributions. See CocipParams.radius_threshold_um

Returns:

npt.NDArray[np.float64] – Array with shape n_waypoints x 8 columns, where each column is the weights to the ice particle habits, [\([0 - 1]\)], and the sum of each column should be equal to 1.

Raises:

ValueError – Raises when habit_distributions do not sum to 1 across columns or if there is a size mismatch with radius_threshold_um.

pycontrails.models.cocip.radiative_forcing.longwave_radiative_forcing(r_vol_um, olr, air_temperature, tau_contrail, tau_cirrus, habit_weights_, r_eff_um=None)

Calculate the local contrail longwave radiative forcing (\(RF_{LW}\)).

All returned values are positive.

Parameters:
  • r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

  • olr (npt.NDArray[np.float64]) – Outgoing longwave radiation at each waypoint, [\(W m^{-2}\)]

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

  • tau_contrail (npt.NDArray[np.float64]) – Contrail optical depth at each waypoint

  • tau_cirrus (npt.NDArray[np.float64]) – Optical depth of numerical weather prediction (NWP) cirrus above the contrail at each waypoint

  • habit_weights_ (npt.NDArray[np.float64]) – Weights to different ice particle habits for each waypoint, n_waypoints x 8 (habit) columns, [\([0 - 1]\)]

  • r_eff_um (npt.NDArray[np.float64], optional) – Provide effective radius corresponding to elements in r_vol_um, [\(\mu m\)]. Defaults to None, which means the effective radius will be calculated using r_vol_um and habit types in effective_radius_by_habit().

Returns:

npt.NDArray[np.float64] – Local contrail longwave radiative forcing (positive), [\(W m^{-2}\)]

Raises:

ValueError – If r_eff_um and olr have different shapes.

References

pycontrails.models.cocip.radiative_forcing.net_radiative_forcing(rf_lw, rf_sw)

Calculate the local contrail net radiative forcing (rf_net).

RF Net = Longwave RF (positive) + Shortwave RF (negative)

Parameters:
  • rf_lw (npt.NDArray[np.float64]) – local contrail longwave radiative forcing, [\(W m^{-2}\)]

  • rf_sw (npt.NDArray[np.float64]) – local contrail shortwave radiative forcing, [\(W m^{-2}\)]

Returns:

npt.NDArray[np.float64] – local contrail net radiative forcing, [\(W m^{-2}\)]

pycontrails.models.cocip.radiative_forcing.olr_reduction_natural_cirrus(tau_cirrus, delta_lc)

Calculate reduction in outgoing longwave radiation (OLR) due to the presence of natural cirrus.

Natural cirrus has optical depth tau_cirrus above the contrail. See e_lw in Eq. (4) of Schumann et al. (2012).

Parameters:
  • tau_cirrus (npt.NDArray[np.float64]) – Optical depth of numerical weather prediction (NWP) cirrus above the contrail for each waypoint.

  • delta_lc (npt.NDArray[np.float64]) – Habit specific parameter to approximate the reduction of the outgoing longwave radiation at the contrail level due to natural cirrus above the contrail.

Returns:

npt.NDArray[np.float64] – Reduction of outgoing longwave radiation

pycontrails.models.cocip.radiative_forcing.shortwave_radiative_forcing(r_vol_um, sdr, rsr, sd0, tau_contrail, tau_cirrus, habit_weights_, r_eff_um=None)

Calculate the local contrail shortwave radiative forcing (\(RF_{SW}\)).

All returned values are negative.

Parameters:
  • r_vol_um (npt.NDArray[np.float64]) – Contrail ice particle volume mean radius, [\(\mu m\)]

  • sdr (npt.NDArray[np.float64]) – Solar direct radiation, [\(W m^{-2}\)]

  • rsr (npt.NDArray[np.float64]) – Reflected solar radiation, [\(W m^{-2}\)]

  • sd0 (npt.NDArray[np.float64]) – Solar constant, [\(W m^{-2}\)]

  • tau_contrail (npt.NDArray[np.float64]) – Contrail optical depth for each waypoint

  • tau_cirrus (npt.NDArray[np.float64]) – Optical depth of numerical weather prediction (NWP) cirrus above the contrail for each waypoint.

  • habit_weights_ (npt.NDArray[np.float64]) – Weights to different ice particle habits for each waypoint, n_waypoints x 8 (habit) columns, [\([0 - 1]\)]

  • r_eff_um (npt.NDArray[np.float64], optional) – Provide effective radius corresponding to elements in r_vol_um, [\(\mu m\)]. Defaults to None, which means the effective radius will be calculated using r_vol_um and habit types in effective_radius_by_habit().

Returns:

npt.NDArray[np.float64] – Local contrail shortwave radiative forcing (negative), [\(W m^{-2}\)]

Raises:

ValueError – If r_eff_um and sdr have different shapes.

References