pycontrails 0.58.0__cp314-cp314-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pycontrails might be problematic. Click here for more details.
- pycontrails/__init__.py +70 -0
- pycontrails/_version.py +34 -0
- pycontrails/core/__init__.py +30 -0
- pycontrails/core/aircraft_performance.py +679 -0
- pycontrails/core/airports.py +228 -0
- pycontrails/core/cache.py +889 -0
- pycontrails/core/coordinates.py +174 -0
- pycontrails/core/fleet.py +483 -0
- pycontrails/core/flight.py +2185 -0
- pycontrails/core/flightplan.py +228 -0
- pycontrails/core/fuel.py +140 -0
- pycontrails/core/interpolation.py +702 -0
- pycontrails/core/met.py +2931 -0
- pycontrails/core/met_var.py +387 -0
- pycontrails/core/models.py +1321 -0
- pycontrails/core/polygon.py +549 -0
- pycontrails/core/rgi_cython.cpython-314-darwin.so +0 -0
- pycontrails/core/vector.py +2249 -0
- pycontrails/datalib/__init__.py +12 -0
- pycontrails/datalib/_met_utils/metsource.py +746 -0
- pycontrails/datalib/ecmwf/__init__.py +73 -0
- pycontrails/datalib/ecmwf/arco_era5.py +345 -0
- pycontrails/datalib/ecmwf/common.py +114 -0
- pycontrails/datalib/ecmwf/era5.py +554 -0
- pycontrails/datalib/ecmwf/era5_model_level.py +490 -0
- pycontrails/datalib/ecmwf/hres.py +804 -0
- pycontrails/datalib/ecmwf/hres_model_level.py +466 -0
- pycontrails/datalib/ecmwf/ifs.py +287 -0
- pycontrails/datalib/ecmwf/model_levels.py +435 -0
- pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv +139 -0
- pycontrails/datalib/ecmwf/variables.py +268 -0
- pycontrails/datalib/geo_utils.py +261 -0
- pycontrails/datalib/gfs/__init__.py +28 -0
- pycontrails/datalib/gfs/gfs.py +656 -0
- pycontrails/datalib/gfs/variables.py +104 -0
- pycontrails/datalib/goes.py +757 -0
- pycontrails/datalib/himawari/__init__.py +27 -0
- pycontrails/datalib/himawari/header_struct.py +266 -0
- pycontrails/datalib/himawari/himawari.py +667 -0
- pycontrails/datalib/landsat.py +589 -0
- pycontrails/datalib/leo_utils/__init__.py +5 -0
- pycontrails/datalib/leo_utils/correction.py +266 -0
- pycontrails/datalib/leo_utils/landsat_metadata.py +300 -0
- pycontrails/datalib/leo_utils/search.py +250 -0
- pycontrails/datalib/leo_utils/sentinel_metadata.py +748 -0
- pycontrails/datalib/leo_utils/static/bq_roi_query.sql +6 -0
- pycontrails/datalib/leo_utils/vis.py +59 -0
- pycontrails/datalib/sentinel.py +650 -0
- pycontrails/datalib/spire/__init__.py +5 -0
- pycontrails/datalib/spire/exceptions.py +62 -0
- pycontrails/datalib/spire/spire.py +604 -0
- pycontrails/ext/bada.py +42 -0
- pycontrails/ext/cirium.py +14 -0
- pycontrails/ext/empirical_grid.py +140 -0
- pycontrails/ext/synthetic_flight.py +431 -0
- pycontrails/models/__init__.py +1 -0
- pycontrails/models/accf.py +425 -0
- pycontrails/models/apcemm/__init__.py +8 -0
- pycontrails/models/apcemm/apcemm.py +983 -0
- pycontrails/models/apcemm/inputs.py +226 -0
- pycontrails/models/apcemm/static/apcemm_yaml_template.yaml +183 -0
- pycontrails/models/apcemm/utils.py +437 -0
- pycontrails/models/cocip/__init__.py +29 -0
- pycontrails/models/cocip/cocip.py +2742 -0
- pycontrails/models/cocip/cocip_params.py +305 -0
- pycontrails/models/cocip/cocip_uncertainty.py +291 -0
- pycontrails/models/cocip/contrail_properties.py +1530 -0
- pycontrails/models/cocip/output_formats.py +2270 -0
- pycontrails/models/cocip/radiative_forcing.py +1260 -0
- pycontrails/models/cocip/radiative_heating.py +520 -0
- pycontrails/models/cocip/unterstrasser_wake_vortex.py +508 -0
- pycontrails/models/cocip/wake_vortex.py +396 -0
- pycontrails/models/cocip/wind_shear.py +120 -0
- pycontrails/models/cocipgrid/__init__.py +9 -0
- pycontrails/models/cocipgrid/cocip_grid.py +2552 -0
- pycontrails/models/cocipgrid/cocip_grid_params.py +138 -0
- pycontrails/models/dry_advection.py +602 -0
- pycontrails/models/emissions/__init__.py +21 -0
- pycontrails/models/emissions/black_carbon.py +599 -0
- pycontrails/models/emissions/emissions.py +1353 -0
- pycontrails/models/emissions/ffm2.py +336 -0
- pycontrails/models/emissions/static/default-engine-uids.csv +239 -0
- pycontrails/models/emissions/static/edb-gaseous-v29b-engines.csv +596 -0
- pycontrails/models/emissions/static/edb-nvpm-v29b-engines.csv +215 -0
- pycontrails/models/extended_k15.py +1327 -0
- pycontrails/models/humidity_scaling/__init__.py +37 -0
- pycontrails/models/humidity_scaling/humidity_scaling.py +1075 -0
- pycontrails/models/humidity_scaling/quantiles/era5-model-level-quantiles.pq +0 -0
- pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq +0 -0
- pycontrails/models/issr.py +210 -0
- pycontrails/models/pcc.py +326 -0
- pycontrails/models/pcr.py +154 -0
- pycontrails/models/ps_model/__init__.py +18 -0
- pycontrails/models/ps_model/ps_aircraft_params.py +381 -0
- pycontrails/models/ps_model/ps_grid.py +701 -0
- pycontrails/models/ps_model/ps_model.py +1000 -0
- pycontrails/models/ps_model/ps_operational_limits.py +525 -0
- pycontrails/models/ps_model/static/ps-aircraft-params-20250328.csv +69 -0
- pycontrails/models/ps_model/static/ps-synonym-list-20250328.csv +104 -0
- pycontrails/models/sac.py +442 -0
- pycontrails/models/tau_cirrus.py +183 -0
- pycontrails/physics/__init__.py +1 -0
- pycontrails/physics/constants.py +117 -0
- pycontrails/physics/geo.py +1138 -0
- pycontrails/physics/jet.py +968 -0
- pycontrails/physics/static/iata-cargo-load-factors-20250221.csv +74 -0
- pycontrails/physics/static/iata-passenger-load-factors-20250221.csv +74 -0
- pycontrails/physics/thermo.py +551 -0
- pycontrails/physics/units.py +472 -0
- pycontrails/py.typed +0 -0
- pycontrails/utils/__init__.py +1 -0
- pycontrails/utils/dependencies.py +66 -0
- pycontrails/utils/iteration.py +13 -0
- pycontrails/utils/json.py +187 -0
- pycontrails/utils/temp.py +50 -0
- pycontrails/utils/types.py +163 -0
- pycontrails-0.58.0.dist-info/METADATA +180 -0
- pycontrails-0.58.0.dist-info/RECORD +122 -0
- pycontrails-0.58.0.dist-info/WHEEL +6 -0
- pycontrails-0.58.0.dist-info/licenses/LICENSE +178 -0
- pycontrails-0.58.0.dist-info/licenses/NOTICE +43 -0
- pycontrails-0.58.0.dist-info/top_level.txt +3 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"""Calculate nitrogen oxide (NOx), carbon monoxide (CO) and hydrocarbon (HC) emissions.
|
|
2
|
+
|
|
3
|
+
This modules applies the Fuel Flow Method 2 (FFM2) from DuBois & Paynter (2006) for a given
|
|
4
|
+
aircraft-engine pair.
|
|
5
|
+
|
|
6
|
+
References
|
|
7
|
+
----------
|
|
8
|
+
- :cite:`duboisFuelFlowMethod22006`
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import functools
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
import numpy.typing as npt
|
|
17
|
+
|
|
18
|
+
from pycontrails.core.interpolation import EmissionsProfileInterpolator
|
|
19
|
+
from pycontrails.physics import jet, units
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@functools.cache
|
|
23
|
+
def nitrogen_oxide_emissions_index_profile(
|
|
24
|
+
ff_idle: float,
|
|
25
|
+
ff_approach: float,
|
|
26
|
+
ff_climb: float,
|
|
27
|
+
ff_take_off: float,
|
|
28
|
+
ei_nox_idle: float,
|
|
29
|
+
ei_nox_approach: float,
|
|
30
|
+
ei_nox_climb: float,
|
|
31
|
+
ei_nox_take_off: float,
|
|
32
|
+
) -> EmissionsProfileInterpolator:
|
|
33
|
+
"""
|
|
34
|
+
Create the nitrogen oxide (NOx) emissions index (EI) profile for the given engine type.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
ff_idle: float
|
|
39
|
+
ICAO EDB fuel mass flow rate at idle conditions (7% power), [:math:`kg s^{-1}`]
|
|
40
|
+
ff_approach: float
|
|
41
|
+
ICAO EDB fuel mass flow rate at approach (30% power), [:math:`kg s^{-1}`]
|
|
42
|
+
ff_climb: float
|
|
43
|
+
ICAO EDB fuel mass flow rate at climb out (85% power), [:math:`kg s^{-1}`]
|
|
44
|
+
ff_take_off: float
|
|
45
|
+
ICAO EDB fuel mass flow rate at take-off (100% power), [:math:`kg s^{-1}`]
|
|
46
|
+
ei_nox_idle: float
|
|
47
|
+
ICAO EDB NOx emissions index at idle conditions (7% power), [:math:`g_{NO_{X}}/kg_{fuel}`]
|
|
48
|
+
ei_nox_approach: float
|
|
49
|
+
ICAO EDB NOx emissions index at approach (30% power), [:math:`g_{NO_{X}}/kg_{fuel}`]
|
|
50
|
+
ei_nox_climb: float
|
|
51
|
+
ICAO EDB NOx emissions index at climb out (85% power), [:math:`g_{NO_{X}}/kg_{fuel}`]
|
|
52
|
+
ei_nox_take_off: float
|
|
53
|
+
ICAO EDB NOx emissions index at take-off (100% power), [:math:`g_{NO_{X}}/kg_{fuel}`]
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
EmissionsProfileInterpolator
|
|
58
|
+
log of NOx emissions index versus the log of fuel mass flow rate for a given engine type
|
|
59
|
+
|
|
60
|
+
Raises
|
|
61
|
+
------
|
|
62
|
+
ValueError
|
|
63
|
+
If any EI nox values are non-positive.
|
|
64
|
+
"""
|
|
65
|
+
fuel_flow = np.array([ff_idle, ff_approach, ff_climb, ff_take_off], dtype=float)
|
|
66
|
+
installation_correction_factor = np.array([1.100, 1.020, 1.013, 1.010])
|
|
67
|
+
fuel_flow *= installation_correction_factor
|
|
68
|
+
|
|
69
|
+
ei_nox = np.array([ei_nox_idle, ei_nox_approach, ei_nox_climb, ei_nox_take_off], dtype=float)
|
|
70
|
+
|
|
71
|
+
if np.any(ei_nox <= 0):
|
|
72
|
+
raise ValueError("Zero value(s) encountered in the EI NOx.")
|
|
73
|
+
|
|
74
|
+
return EmissionsProfileInterpolator(xp=np.log(fuel_flow), fp=np.log(ei_nox))
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@functools.cache
|
|
78
|
+
def co_hc_emissions_index_profile(
|
|
79
|
+
ff_idle: float,
|
|
80
|
+
ff_approach: float,
|
|
81
|
+
ff_climb: float,
|
|
82
|
+
ff_take_off: float,
|
|
83
|
+
ei_idle: float,
|
|
84
|
+
ei_approach: float,
|
|
85
|
+
ei_climb: float,
|
|
86
|
+
ei_take_off: float,
|
|
87
|
+
) -> EmissionsProfileInterpolator:
|
|
88
|
+
"""Create carbon monoxide (CO) and hydrocarbon (HC) emissions index (EI) profile.
|
|
89
|
+
|
|
90
|
+
Parameters
|
|
91
|
+
----------
|
|
92
|
+
ff_idle: float
|
|
93
|
+
ICAO EDB fuel mass flow rate at idle conditions
|
|
94
|
+
(7% power), [:math:`kg s^{-1}`]
|
|
95
|
+
ff_approach: float
|
|
96
|
+
ICAO EDB fuel mass flow rate at approach
|
|
97
|
+
(30% power), [:math:`kg s^{-1}`]
|
|
98
|
+
ff_climb: float
|
|
99
|
+
ICAO EDB fuel mass flow rate at climb out
|
|
100
|
+
(85% power), [:math:`kg s^{-1}`]
|
|
101
|
+
ff_take_off: float
|
|
102
|
+
ICAO EDB fuel mass flow rate at take-off
|
|
103
|
+
(100% power), [:math:`kg s^{-1}`]
|
|
104
|
+
ei_idle: float
|
|
105
|
+
ICAO EDB CO or HC emissions index at idle conditions
|
|
106
|
+
(7% power), [:math:`g_{pollutant}/kg_{fuel}`]
|
|
107
|
+
ei_approach: float
|
|
108
|
+
ICAO EDB CO or HC emissions index at approach
|
|
109
|
+
(30% power), [:math:`g_{pollutant}/kg_{fuel}`]
|
|
110
|
+
ei_climb: float
|
|
111
|
+
ICAO EDB CO or HC emissions index at climb out
|
|
112
|
+
(85% power), [:math:`g_{pollutant}/kg_{fuel}`]
|
|
113
|
+
ei_take_off: float
|
|
114
|
+
ICAO EDB CO or HC emissions index at take-off
|
|
115
|
+
(100% power), [:math:`g_{pollutant}/kg_{fuel}`]
|
|
116
|
+
|
|
117
|
+
Returns
|
|
118
|
+
-------
|
|
119
|
+
EmissionsProfileInterpolator
|
|
120
|
+
log of CO or HC emissions index versus the log of fuel mass
|
|
121
|
+
flow rate for a given engine type
|
|
122
|
+
"""
|
|
123
|
+
fuel_flow_edb = np.array([ff_idle, ff_approach, ff_climb, ff_take_off], dtype=float)
|
|
124
|
+
installation_correction_factor = np.array([1.100, 1.020, 1.013, 1.010])
|
|
125
|
+
fuel_flow_edb *= installation_correction_factor
|
|
126
|
+
|
|
127
|
+
ei_edb = np.array([ei_idle, ei_approach, ei_climb, ei_take_off], dtype=float)
|
|
128
|
+
min_vals_ = np.array([1e-3, 1e-3, 1e-4, 1e-4])
|
|
129
|
+
ei_edb = np.maximum(ei_edb, min_vals_)
|
|
130
|
+
|
|
131
|
+
# Get straight-line equation between idle and approach
|
|
132
|
+
m, c = np.polyfit(fuel_flow_edb[:2], ei_edb[:2], deg=1)
|
|
133
|
+
ei_climb_extrapolate = m * fuel_flow_edb[2] + c
|
|
134
|
+
ei_hi = np.mean(ei_edb[2:])
|
|
135
|
+
|
|
136
|
+
ff_low_power = fuel_flow_edb[3] * 0.03
|
|
137
|
+
ei_co_low_power = min((m * ff_low_power + c), (2 * ei_edb[0]))
|
|
138
|
+
ei_co_low_power = max(
|
|
139
|
+
ei_co_low_power, 1e-3
|
|
140
|
+
) # Prevent zero/negative values, similar to line 115
|
|
141
|
+
|
|
142
|
+
# Permutation 1: Emissions profile when the bi-linear fit does not work
|
|
143
|
+
# (Figure 14 of DuBois & Paynter, 2006)
|
|
144
|
+
if ei_edb[1] < ei_edb[2]:
|
|
145
|
+
ff_profile = np.insert(fuel_flow_edb, 0, ff_low_power)
|
|
146
|
+
ei_profile = np.array([ei_co_low_power, ei_edb[0], ei_edb[1], ei_hi, ei_hi])
|
|
147
|
+
|
|
148
|
+
# Permutation 2: Emissions profile using a bi-linear fit (Figure 8 of DuBois & Paynter, 2006)
|
|
149
|
+
elif ei_climb_extrapolate < ei_edb[2] and (m != 0):
|
|
150
|
+
ff_intersect = (ei_hi - c) / m
|
|
151
|
+
# Ensure intersection is between 30% and 85% fuel mass flow rate
|
|
152
|
+
ff_intersect = np.clip(ff_intersect, fuel_flow_edb[1] + 0.01, fuel_flow_edb[2] - 0.01)
|
|
153
|
+
ff_profile = np.array(
|
|
154
|
+
[
|
|
155
|
+
ff_low_power,
|
|
156
|
+
fuel_flow_edb[0],
|
|
157
|
+
fuel_flow_edb[1],
|
|
158
|
+
ff_intersect,
|
|
159
|
+
fuel_flow_edb[2],
|
|
160
|
+
fuel_flow_edb[3],
|
|
161
|
+
]
|
|
162
|
+
)
|
|
163
|
+
ei_profile = np.array([ei_co_low_power, ei_edb[0], ei_edb[1], ei_hi, ei_hi, ei_hi])
|
|
164
|
+
|
|
165
|
+
# Permutation 3: Point-to-point fit (Figure 13 of DuBois & Paynter, 2006)
|
|
166
|
+
else:
|
|
167
|
+
ff_profile = np.insert(fuel_flow_edb, 0, ff_low_power)
|
|
168
|
+
ei_profile = np.insert(ei_edb, 0, ei_co_low_power)
|
|
169
|
+
|
|
170
|
+
return EmissionsProfileInterpolator(xp=np.log(ff_profile), fp=np.log(ei_profile))
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def estimate_nox(
|
|
174
|
+
log_ei_nox_profile: EmissionsProfileInterpolator,
|
|
175
|
+
fuel_flow_per_engine: npt.NDArray[np.floating],
|
|
176
|
+
true_airspeed: npt.NDArray[np.floating],
|
|
177
|
+
air_pressure: npt.NDArray[np.floating],
|
|
178
|
+
air_temperature: npt.NDArray[np.floating],
|
|
179
|
+
specific_humidity: None | npt.NDArray[np.floating] = None,
|
|
180
|
+
) -> npt.NDArray[np.floating]:
|
|
181
|
+
"""Estimate the nitrogen oxide (NOx) emissions index (EI) at cruise conditions.
|
|
182
|
+
|
|
183
|
+
Parameters
|
|
184
|
+
----------
|
|
185
|
+
log_ei_nox_profile: EmissionsProfileInterpolator
|
|
186
|
+
emissions profile containing the log of EI NOx versus log of fuel flow.
|
|
187
|
+
fuel_flow_per_engine: npt.NDArray[np.floating]
|
|
188
|
+
fuel mass flow rate per engine, [:math:`kg s^{-1}`]
|
|
189
|
+
true_airspeed: npt.NDArray[np.floating]
|
|
190
|
+
true airspeed for each waypoint, [:math:`m s^{-1}`]
|
|
191
|
+
air_pressure : npt.NDArray[np.floating]
|
|
192
|
+
pressure altitude at each waypoint, [:math:`Pa`]
|
|
193
|
+
air_temperature : npt.NDArray[np.floating]
|
|
194
|
+
ambient temperature for each waypoint, [:math:`K`]
|
|
195
|
+
specific_humidity: npt.NDArray[np.floating] | None
|
|
196
|
+
specific humidity for each waypoint, [:math:`kg_{H_{2}O}/kg_{air}`]
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
if specific_humidity is None:
|
|
200
|
+
specific_humidity = _estimate_specific_humidity(air_temperature, air_pressure, rh=0.6)
|
|
201
|
+
|
|
202
|
+
# Derived quantities
|
|
203
|
+
mach_num = units.tas_to_mach_number(true_airspeed, air_temperature)
|
|
204
|
+
theta_amb = jet.temperature_ratio(air_temperature)
|
|
205
|
+
delta_amb = jet.pressure_ratio(air_pressure)
|
|
206
|
+
fuel_flow_sl = jet.equivalent_fuel_flow_rate_at_sea_level(
|
|
207
|
+
fuel_flow_per_engine, theta_amb, delta_amb, mach_num
|
|
208
|
+
)
|
|
209
|
+
ei_nox_sl = log_ei_nox_profile.log_interp(fuel_flow_sl)
|
|
210
|
+
|
|
211
|
+
q_correction = _get_humidity_correction_factor(specific_humidity)
|
|
212
|
+
ei_cruise = ei_at_cruise(ei_nox_sl, theta_amb, delta_amb, "NOX")
|
|
213
|
+
return ei_cruise * q_correction
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def estimate_ei(
|
|
217
|
+
log_ei_profile: EmissionsProfileInterpolator,
|
|
218
|
+
fuel_flow_per_engine: npt.NDArray[np.floating],
|
|
219
|
+
true_airspeed: npt.NDArray[np.floating],
|
|
220
|
+
air_pressure: npt.NDArray[np.floating],
|
|
221
|
+
air_temperature: npt.NDArray[np.floating],
|
|
222
|
+
) -> npt.NDArray[np.floating]:
|
|
223
|
+
"""Estimate carbon monoxide (CO) or hydrocarbon (HC) emissions index (EI).
|
|
224
|
+
|
|
225
|
+
Parameters
|
|
226
|
+
----------
|
|
227
|
+
log_ei_profile: EmissionsProfileInterpolator
|
|
228
|
+
emissions profile containing the log of EI CO or EI HC versus log of fuel flow.
|
|
229
|
+
fuel_flow_per_engine: npt.NDArray[np.floating]
|
|
230
|
+
fuel mass flow rate per engine, [:math:`kg s^{-1}`]
|
|
231
|
+
true_airspeed: npt.NDArray[np.floating]
|
|
232
|
+
true airspeed for each waypoint, [:math:`m s^{-1}`]
|
|
233
|
+
air_pressure : npt.NDArray[np.floating]
|
|
234
|
+
pressure altitude at each waypoint, [:math:`Pa`]
|
|
235
|
+
air_temperature : npt.NDArray[np.floating]
|
|
236
|
+
ambient temperature for each waypoint, [:math:`K`]
|
|
237
|
+
"""
|
|
238
|
+
mach_num = units.tas_to_mach_number(true_airspeed, air_temperature)
|
|
239
|
+
theta_amb = jet.temperature_ratio(air_temperature)
|
|
240
|
+
delta_amb = jet.pressure_ratio(air_pressure)
|
|
241
|
+
fuel_flow_sl = jet.equivalent_fuel_flow_rate_at_sea_level(
|
|
242
|
+
fuel_flow_per_engine, theta_amb, delta_amb, mach_num
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
ei_sl = log_ei_profile.log_interp(fuel_flow_sl)
|
|
246
|
+
return ei_at_cruise(ei_sl, theta_amb, delta_amb, "HC")
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
# -----------------------
|
|
250
|
+
# Common helper functions
|
|
251
|
+
# -----------------------
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def ei_at_cruise(
|
|
255
|
+
ei_sl: npt.NDArray[np.floating],
|
|
256
|
+
theta_amb: npt.NDArray[np.floating],
|
|
257
|
+
delta_amb: npt.NDArray[np.floating],
|
|
258
|
+
ei_type: str,
|
|
259
|
+
) -> npt.NDArray[np.floating]:
|
|
260
|
+
"""Convert the estimated EI at sea level to cruise conditions.
|
|
261
|
+
|
|
262
|
+
Refer to Eqs. (15) and (16) in DuBois & Paynter (2006).
|
|
263
|
+
|
|
264
|
+
Parameters
|
|
265
|
+
----------
|
|
266
|
+
ei_sl : npt.NDArray[np.floating]
|
|
267
|
+
Sea level EI values.
|
|
268
|
+
theta_amb : npt.NDArray[np.floating]
|
|
269
|
+
Ratio of the ambient temperature to the temperature at mean sea-level.
|
|
270
|
+
delta_amb : npt.NDArray[np.floating]
|
|
271
|
+
Ratio of the pressure altitude to the surface pressure.
|
|
272
|
+
ei_type : str
|
|
273
|
+
One of {"HC", "CO", "NOX"}
|
|
274
|
+
|
|
275
|
+
Returns
|
|
276
|
+
-------
|
|
277
|
+
npt.NDArray[np.floating]
|
|
278
|
+
Estimated cruise EI values.
|
|
279
|
+
|
|
280
|
+
References
|
|
281
|
+
----------
|
|
282
|
+
- :cite:`duboisFuelFlowMethod22006`
|
|
283
|
+
"""
|
|
284
|
+
if ei_type in ["HC", "CO"]:
|
|
285
|
+
# bottom of page 3, x = 1
|
|
286
|
+
return ei_sl * (theta_amb**3.3 / delta_amb**1.02)
|
|
287
|
+
if ei_type == "NOX":
|
|
288
|
+
# bottom of page 3, y = 0.5
|
|
289
|
+
y = 0.5
|
|
290
|
+
return ei_sl * (delta_amb**1.02 / theta_amb**3.3) ** y
|
|
291
|
+
raise ValueError("Expect ei_type to be one of 'HC', 'CO', or 'NOX'")
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def _get_humidity_correction_factor(
|
|
295
|
+
specific_humidity: npt.NDArray[np.floating],
|
|
296
|
+
) -> npt.NDArray[np.floating]:
|
|
297
|
+
return np.exp(-19 * (specific_humidity - 0.00634))
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _estimate_specific_humidity(
|
|
301
|
+
air_temperature: npt.NDArray[np.floating], air_pressure: npt.NDArray[np.floating], rh: float
|
|
302
|
+
) -> npt.NDArray[np.floating]:
|
|
303
|
+
"""Estimate the specific humidity by assuming a fixed relative humidity.
|
|
304
|
+
|
|
305
|
+
Refer to Eqs. (43), (44) and (45) in DuBois & Paynter (2006).
|
|
306
|
+
|
|
307
|
+
Parameters
|
|
308
|
+
----------
|
|
309
|
+
air_temperature : npt.NDArray[np.floating]
|
|
310
|
+
Air temperature, [:math:`K`]
|
|
311
|
+
air_pressure : npt.NDArray[np.floating]
|
|
312
|
+
Air pressure, [:math:`Pa`]
|
|
313
|
+
rh : float
|
|
314
|
+
Relative humidity, [:math:`0 - 1`]
|
|
315
|
+
|
|
316
|
+
Returns
|
|
317
|
+
-------
|
|
318
|
+
npt.NDArray[np.floating]
|
|
319
|
+
Estimated specific humidity, [:math:`kg kg^{-1}`]
|
|
320
|
+
|
|
321
|
+
References
|
|
322
|
+
----------
|
|
323
|
+
- :cite:`duboisFuelFlowMethod22006`
|
|
324
|
+
"""
|
|
325
|
+
# Equation (43)
|
|
326
|
+
air_temperature_celsius = units.kelvin_to_celsius(air_temperature)
|
|
327
|
+
|
|
328
|
+
# Equation (44)
|
|
329
|
+
exponent = (7.5 * air_temperature_celsius) / (237.3 + air_temperature_celsius)
|
|
330
|
+
P_sat = 6.107 * 10**exponent
|
|
331
|
+
|
|
332
|
+
# Equation (45)
|
|
333
|
+
air_pressure_hpa = air_pressure / 100
|
|
334
|
+
numer = 0.62197058 * rh * P_sat
|
|
335
|
+
denom = air_pressure_hpa - rh * P_sat
|
|
336
|
+
return numer / denom
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
aircraft_type,engine_uid,engine_name,n_engine
|
|
2
|
+
A148,13ZM003,D-436-148,2
|
|
3
|
+
A158,13ZM003,D-436-148,2
|
|
4
|
+
A178,8GE116,CF34-10E6,2
|
|
5
|
+
A19N,01P22PW163,PW1127G,2
|
|
6
|
+
A20N,01P18PW153,PW1127G,2
|
|
7
|
+
A21N,01P20CM132,LEAP-1A32,2
|
|
8
|
+
A306,1PW048,PW4158,2
|
|
9
|
+
A30B,1GE008,CF6-50C2R,2
|
|
10
|
+
A310,1GE016,CF6-80C2A2,2
|
|
11
|
+
A318,01P08CM110,CFM56-5B9,2
|
|
12
|
+
A319,01P10IA019,IAE V2522-A5,2
|
|
13
|
+
A320,01P08CM105,CFM56-5B4/P SAC,2
|
|
14
|
+
A321,04P10IA027,IAE V2530-A5,2
|
|
15
|
+
A330,01P14RR102,Trent 772B,2
|
|
16
|
+
A332,01P14RR102,RR TRENT 772B,2
|
|
17
|
+
A333,1GE033,CF6-80E1A2,2
|
|
18
|
+
A337,1GE021,CF6-80C2A8,2
|
|
19
|
+
A338,02P23RR141,Trent 7000-72,2
|
|
20
|
+
A339,02P23RR141,Trent 7000-72,2
|
|
21
|
+
A340,2CM015,CFM56-5C4,4
|
|
22
|
+
A342,2CM015,CFM56-5C4,4
|
|
23
|
+
A343,2CM015,CFM56-5C4,4
|
|
24
|
+
A345,8RR044,RR TRENT 553,4
|
|
25
|
+
A346,6RR041,RR TRENT 556,4
|
|
26
|
+
A350,01P18RR124,Trent XWB-84,2
|
|
27
|
+
A358,01P18RR124,Trent XWB-84,2
|
|
28
|
+
A359,01P18RR124,RR TRENT XWB-84,2
|
|
29
|
+
A35K,01P21RR125,Trent XWB-97,2
|
|
30
|
+
A380,01P18RR103,Trent 900,4
|
|
31
|
+
A388,01P18RR103,RR TRENT 900,4
|
|
32
|
+
A3ST,1GE021,CF6-80C2A8,2
|
|
33
|
+
A400,1AA002,D-30KP-II,4
|
|
34
|
+
A50,1AA002,D-30KP-II,4
|
|
35
|
+
A743,13ZM003,D-436-148,2
|
|
36
|
+
AJ27,13ZM003,D-436-148,2
|
|
37
|
+
AN22,02P23RR141,Trent 7000-72,2
|
|
38
|
+
AN72,1RR020,Tay 620-15,2
|
|
39
|
+
ASTR,1AS001,TFE731-40AR,2
|
|
40
|
+
B37M,01P20CM136,LEAP-1B27,2
|
|
41
|
+
B38M,01P20CM136,LEAP-1B27,2
|
|
42
|
+
B39M,01P20CM140,LEAP-1B28,2
|
|
43
|
+
B3XM,01P20CM140,LEAP-1B28,2
|
|
44
|
+
B461,1TL003,ALF 502R-5,4
|
|
45
|
+
B462,1TL003,ALF 502R-5,4
|
|
46
|
+
B463,1TL003,ALF 502R-5,4
|
|
47
|
+
B701,1RR013,RB211-535E4,2
|
|
48
|
+
B703,1PW001,JT4A-9,4
|
|
49
|
+
B707,1PW001,JT4A-9,4
|
|
50
|
+
B712,4BR004,BR700-715C1,2
|
|
51
|
+
B720,1RR013,RB211-535E4,2
|
|
52
|
+
B721,1RR013,RB211-535E4,2
|
|
53
|
+
B722,4BR002,JT8D-15,3
|
|
54
|
+
B731,1AA001,D-30-III,2
|
|
55
|
+
B732,1PW009,JT8D-15,2
|
|
56
|
+
B733,1CM004,CFM56-3B1 (20K),2
|
|
57
|
+
B734,1CM007,CFM56-3C (23.5K),2
|
|
58
|
+
B735,1CM004,CFM56-3B1 (18.5K),2
|
|
59
|
+
B736,01P11CM112,CFM56-7B22,2
|
|
60
|
+
B737,01P11CM114,CFM56-7B24,2
|
|
61
|
+
B738,01P11CM116,CFM56-7B26/27,2
|
|
62
|
+
B739,01P11CM121,CFM56-7B26/27,2
|
|
63
|
+
B741,1PW029,CF6-50E2,4
|
|
64
|
+
B742,1RR008,RB211-524D4,4
|
|
65
|
+
B743,1PW029,JT9D-7R4G2,4
|
|
66
|
+
B744,01P02GE186,CF6-80C2B1F,4
|
|
67
|
+
B747,01P17GE215,GEnx-2B67,4
|
|
68
|
+
B748,01P17GE215,GENX-2B67,4
|
|
69
|
+
B74D,1PW029,CF6-50E2,4
|
|
70
|
+
B74R,1PW029,CF6-50E2,4
|
|
71
|
+
B74S,1RR008,JT9D-7J,4
|
|
72
|
+
B752,5RR038,RB211-535E4,2
|
|
73
|
+
B753,5RR039,RB211-535E4B,2
|
|
74
|
+
B757,3RR028,RB211-535E4-B,2
|
|
75
|
+
B762,1GE012,CF6-80A2,2
|
|
76
|
+
B763,01P02GE188,CF6-80C2B6,2
|
|
77
|
+
B764,8GE101,CF6-80C2B8F,2
|
|
78
|
+
B767,01P02GE188,CF6-80C2B8F,2
|
|
79
|
+
B772,2RR027,Trent892,2
|
|
80
|
+
B773,2RR027,Trent892,2
|
|
81
|
+
B777,01P21GE217,GE90-115BL,2
|
|
82
|
+
B778,01P21GE217,GE90-115BL,2
|
|
83
|
+
B779,01P21GE217,GE90-115BL,2
|
|
84
|
+
B77L,01P21GE216,GE-90 110B1L,2
|
|
85
|
+
B77W,01P21GE217,GE-90 115B,2
|
|
86
|
+
B783,01P17GE210,Trent 1000-A,2
|
|
87
|
+
B787,01P17GE210,Trent 1000-A,2
|
|
88
|
+
B788,01P17GE210,GENX-1B70,2
|
|
89
|
+
B789,01P17GE212,GENX-1B74-75,2
|
|
90
|
+
B78X,01P17GE213,GEnx-1B76,2
|
|
91
|
+
BA11,8RR043,Spey 511-14,2
|
|
92
|
+
BCS1,01P11CM112,CFM56-7B20 DAC,2
|
|
93
|
+
BCS3,01P11CM114,CFM56-7B24,2
|
|
94
|
+
BE40,1PW038,JT15D-5R,2
|
|
95
|
+
BE4W,1PW038,JT15D-5R,2
|
|
96
|
+
BER2,13ZM004,D-436TP,2
|
|
97
|
+
BLCF,01P21GE217,GE90-115BL,2
|
|
98
|
+
C135,1PW001,JT4A-9,4
|
|
99
|
+
C141,1GE015,CF6-80C2A2,2
|
|
100
|
+
C15,1AA004,D-30KU-154-II,3
|
|
101
|
+
C17,01P02GE188,CF6-80C2B8F,2
|
|
102
|
+
C5,8RR044,Trent 553,4
|
|
103
|
+
C500,1PW036,JT15D-4,2
|
|
104
|
+
C501,1PW036,JT15D-4,2
|
|
105
|
+
C550,1PW036,JT15D-4,2
|
|
106
|
+
C551,1PW036,JT15D-4,2
|
|
107
|
+
C560,1PW037,JT15D-5A,2
|
|
108
|
+
C5M,8RR044,Trent 553,4
|
|
109
|
+
C650,1AS002,TFE731-4R-2S,2
|
|
110
|
+
C680,7PW078,PW306C,2
|
|
111
|
+
C68A,7PW078,PW306C,2
|
|
112
|
+
C700,11HN003,AS907-1-1A,2
|
|
113
|
+
C750,6AL022,AE 3007C,2
|
|
114
|
+
C919,01P22PW163,PW1127G,2
|
|
115
|
+
CL30,11HN003,AS907-1-1A,2
|
|
116
|
+
CL35,01P11HN012,HTF7250G,2
|
|
117
|
+
CL60,01P05GE189,CF34-3B,2
|
|
118
|
+
CNBR,1AS001,TFE731-60,3
|
|
119
|
+
CRJ1,1GE035,CF34-3A1,2
|
|
120
|
+
CRJ2,01P05GE189,CF34-3B1,2
|
|
121
|
+
CRJ7,01P08GE190,CF34-8C5,2
|
|
122
|
+
CRJ9,01P08GE190,CF34-8C5,2
|
|
123
|
+
CRJX,01P08GE191,CF34-8C5A1,2
|
|
124
|
+
DC10,3GE074,CF6-50C2,3
|
|
125
|
+
DC85,1CM003,CFM56-2C1,4
|
|
126
|
+
DC86,1CM003,CFM56-2C1,4
|
|
127
|
+
DC87,1CM003,CFM56-2C1,4
|
|
128
|
+
DC91,4BR002,BR700-715A1-30,2
|
|
129
|
+
DC92,1PW008,JT8D-11,2
|
|
130
|
+
DC93,1PW008,JT8D-11,2
|
|
131
|
+
DC94,1PW008,JT8D-11,2
|
|
132
|
+
DC95,1PW008,JT8D-11,2
|
|
133
|
+
E135,01P06AL030,AE 3007A1/3,2
|
|
134
|
+
E145,01P06AL028,AE 3007A1,2
|
|
135
|
+
E170,01P08GE197,CF34-8E5,2
|
|
136
|
+
E190,8GE116,CF34-10E6,2
|
|
137
|
+
E195,8GE119,CF34-10E7,2
|
|
138
|
+
E275,01P08GE191,CF34-8E5A1,2
|
|
139
|
+
E290,20PW134,PW1919G,2
|
|
140
|
+
E295,01P11CM112,CFM56-7B20 DAC,2
|
|
141
|
+
E35L,01P06AL032,AE 3007A1E,2
|
|
142
|
+
E390,01P10IA024,CFM56-5B,2
|
|
143
|
+
E3CF,1GE012,CF6-80A2,2
|
|
144
|
+
E3TF,1GE012,CF6-80A2,2
|
|
145
|
+
E45X,01P06AL032,AE 3007A1E,2
|
|
146
|
+
E545,01P14HN014,AS907-3-1E,2
|
|
147
|
+
E550,01P14HN015,AS907-3-1E,2
|
|
148
|
+
E6,1CM003,CFM56-2C1,4
|
|
149
|
+
E737,01P11CM116,CFM56-7B26/27,2
|
|
150
|
+
E75L,01P08GE191,CF34-8E5A1,2
|
|
151
|
+
E75S,01P08GE191,CF34-8E5A1,2
|
|
152
|
+
E767,1PW043,PW4060,2
|
|
153
|
+
ELIT,1PW036,JT15D-4,2
|
|
154
|
+
F100,1RR020,Tay 620-15,2
|
|
155
|
+
F28,4RR035,Spey 555-15H,2
|
|
156
|
+
F2TH,03P14PW194,PW308C,2
|
|
157
|
+
F70,1RR020,Tay 620-15,2
|
|
158
|
+
F900,1AS001,TFE731-60,3
|
|
159
|
+
FA10,1AS001,TFE731-2-1C,2
|
|
160
|
+
FA50,1AS001,TFE731-40,3
|
|
161
|
+
FA5X,03P16PW192,PW307A,3
|
|
162
|
+
FA6X,03P16PW192,PW307A,3
|
|
163
|
+
FA7X,03P16PW192,PW307A,3
|
|
164
|
+
FA8X,03P16PW192,PW307A,3
|
|
165
|
+
G150,1AS001,TFE731-40AR,2
|
|
166
|
+
G250,01P11HN012,HTF7250G,2
|
|
167
|
+
G280,01P11HN012,HTF7250G,2
|
|
168
|
+
GA5C,03P16PW192,PW307A,3
|
|
169
|
+
GA6C,01P04BR013,BR700-710A2-20,2
|
|
170
|
+
GA7C,01P04BR013,BR700-710A2-20,2
|
|
171
|
+
GALX,01P11HN012,HTF7250G,2
|
|
172
|
+
GL5T,01P04BR013,BR700-710A2-20,2
|
|
173
|
+
GL7T,01P04BR013,BR700-710A2-20,2
|
|
174
|
+
GLEX,01P04BR013,BR700-710A2-20,2
|
|
175
|
+
GLF2,8RR043,Spey 511-8,2
|
|
176
|
+
GLF3,8RR043,Spey 511-8,2
|
|
177
|
+
GLF4,8RR043,Spey 511-8,2
|
|
178
|
+
GLF5,01P06BR014,BR700-710C4-11,2
|
|
179
|
+
GLF6,01P04BR013,BR700-710A2-20,2
|
|
180
|
+
GSPN,1PW036,JT15D-4,2
|
|
181
|
+
H25B,1AS002,TFE731-5BR-1H,2
|
|
182
|
+
H25C,1AS001,TFE731-40AR,2
|
|
183
|
+
HA4T,01P07PW145,PW308A,2
|
|
184
|
+
IL62,3GE074,CF6-50C2,2
|
|
185
|
+
IL76,1AA002,D-30KP-II,4
|
|
186
|
+
IL86,1KK003,NK-86,4
|
|
187
|
+
IL96,1AA005,PS-90A,4
|
|
188
|
+
J328,01P06AL030,AE 3007A1/3,2
|
|
189
|
+
K35,1PW001,JT4A-9,4
|
|
190
|
+
K35A,1PW001,JT4A-9,4
|
|
191
|
+
K35E,1PW001,JT4A-9,4
|
|
192
|
+
K35R,1PW001,JT4A-9,4
|
|
193
|
+
KC2,1PW001,JT4A-9,4
|
|
194
|
+
KE3,1CM003,CFM56-2C1,4
|
|
195
|
+
L101,1RR002,RB211-22B,3
|
|
196
|
+
L29A,01P05GE189,CF34-3B,2
|
|
197
|
+
L29B,01P05GE189,CF34-3B,2
|
|
198
|
+
LJ31,1AS001,TFE731-20R-1B,2
|
|
199
|
+
LJ35,1AS001,TFE731-22B,2
|
|
200
|
+
LJ40,1AS001,TFE731-20R-1B,2
|
|
201
|
+
LJ45,1AS001,TFE731-20R-1B,2
|
|
202
|
+
LJ55,7PW077,PW305A,2
|
|
203
|
+
LJ60,7PW077,PW305A,2
|
|
204
|
+
LJ70,1AS002,TFE731-4R-2S,2
|
|
205
|
+
LJ75,1AS002,TFE731-4R-2S,2
|
|
206
|
+
LJ85,1AS001,TFE731-40,3
|
|
207
|
+
MC23,01P22PW163,PW1127G,2
|
|
208
|
+
MD11,1PW052,PW4460,3
|
|
209
|
+
MD81,4PW070,JT8D-217C,2
|
|
210
|
+
MD82,4PW070,JT8D-217C,2
|
|
211
|
+
MD83,1PW019,JT8D-219,2
|
|
212
|
+
MD87,4PW070,JT8D-217C,2
|
|
213
|
+
MD88,4PW070,JT8D-217C,2
|
|
214
|
+
MD90,1PW019,JT8D-219,2
|
|
215
|
+
MRJ7,13ZM003,D-436-148,2
|
|
216
|
+
MRJ9,13ZM003,D-436-148,2
|
|
217
|
+
MU30,1PW038,JT15D-5R,2
|
|
218
|
+
NIM,01P11CM116,CFM56-7B26/27,2
|
|
219
|
+
P1,01P20CM136,LEAP-1B27,2
|
|
220
|
+
P8,01P11CM116,CFM56-7B26/27,2
|
|
221
|
+
P8A,01P11CM116,CFM56-7B26/27,2
|
|
222
|
+
PC24,1PW037,JT15D-5A,2
|
|
223
|
+
Q25,1GE035,CF34-3A1,2
|
|
224
|
+
Q4,8AL025,AE 3007H,1
|
|
225
|
+
R135,1PW001,JT4A-9,4
|
|
226
|
+
R721,1PW019,JT8D-219,2
|
|
227
|
+
R722,4BR002,JT8D-15,3
|
|
228
|
+
RJ1H,1TL004,LF 507-1F,4
|
|
229
|
+
RJ70,1TL004,LF 507-1F,4
|
|
230
|
+
RJ85,1TL004,LF 507-1F,4
|
|
231
|
+
S210,20PW134,PW1919G,2
|
|
232
|
+
SLCH,01P18RR103,Trent 900,4
|
|
233
|
+
SU95,01P11PJ003,SaM146-1S17,2
|
|
234
|
+
T134,1AA001,D-30-III,2
|
|
235
|
+
T154,1AA004,D-30KU-154-II,3
|
|
236
|
+
T204,1AA005,PS-90A,2
|
|
237
|
+
VC10,1PW001,JT4A-9,4
|
|
238
|
+
Y20,1PW043,PW4060,2
|
|
239
|
+
YK42,1ZM001,D-36,3
|