pycontrails 0.59.0__cp314-cp314-macosx_10_15_x86_64.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.

Files changed (123) hide show
  1. pycontrails/__init__.py +70 -0
  2. pycontrails/_version.py +34 -0
  3. pycontrails/core/__init__.py +30 -0
  4. pycontrails/core/aircraft_performance.py +679 -0
  5. pycontrails/core/airports.py +228 -0
  6. pycontrails/core/cache.py +889 -0
  7. pycontrails/core/coordinates.py +174 -0
  8. pycontrails/core/fleet.py +483 -0
  9. pycontrails/core/flight.py +2185 -0
  10. pycontrails/core/flightplan.py +228 -0
  11. pycontrails/core/fuel.py +140 -0
  12. pycontrails/core/interpolation.py +702 -0
  13. pycontrails/core/met.py +2936 -0
  14. pycontrails/core/met_var.py +387 -0
  15. pycontrails/core/models.py +1321 -0
  16. pycontrails/core/polygon.py +549 -0
  17. pycontrails/core/rgi_cython.cpython-314-darwin.so +0 -0
  18. pycontrails/core/vector.py +2249 -0
  19. pycontrails/datalib/__init__.py +12 -0
  20. pycontrails/datalib/_met_utils/metsource.py +746 -0
  21. pycontrails/datalib/ecmwf/__init__.py +73 -0
  22. pycontrails/datalib/ecmwf/arco_era5.py +345 -0
  23. pycontrails/datalib/ecmwf/common.py +114 -0
  24. pycontrails/datalib/ecmwf/era5.py +554 -0
  25. pycontrails/datalib/ecmwf/era5_model_level.py +490 -0
  26. pycontrails/datalib/ecmwf/hres.py +804 -0
  27. pycontrails/datalib/ecmwf/hres_model_level.py +466 -0
  28. pycontrails/datalib/ecmwf/ifs.py +287 -0
  29. pycontrails/datalib/ecmwf/model_levels.py +435 -0
  30. pycontrails/datalib/ecmwf/static/model_level_dataframe_v20240418.csv +139 -0
  31. pycontrails/datalib/ecmwf/variables.py +268 -0
  32. pycontrails/datalib/geo_utils.py +261 -0
  33. pycontrails/datalib/gfs/__init__.py +28 -0
  34. pycontrails/datalib/gfs/gfs.py +656 -0
  35. pycontrails/datalib/gfs/variables.py +104 -0
  36. pycontrails/datalib/goes.py +764 -0
  37. pycontrails/datalib/gruan.py +343 -0
  38. pycontrails/datalib/himawari/__init__.py +27 -0
  39. pycontrails/datalib/himawari/header_struct.py +266 -0
  40. pycontrails/datalib/himawari/himawari.py +671 -0
  41. pycontrails/datalib/landsat.py +589 -0
  42. pycontrails/datalib/leo_utils/__init__.py +5 -0
  43. pycontrails/datalib/leo_utils/correction.py +266 -0
  44. pycontrails/datalib/leo_utils/landsat_metadata.py +300 -0
  45. pycontrails/datalib/leo_utils/search.py +250 -0
  46. pycontrails/datalib/leo_utils/sentinel_metadata.py +748 -0
  47. pycontrails/datalib/leo_utils/static/bq_roi_query.sql +6 -0
  48. pycontrails/datalib/leo_utils/vis.py +59 -0
  49. pycontrails/datalib/sentinel.py +650 -0
  50. pycontrails/datalib/spire/__init__.py +5 -0
  51. pycontrails/datalib/spire/exceptions.py +62 -0
  52. pycontrails/datalib/spire/spire.py +604 -0
  53. pycontrails/ext/bada.py +42 -0
  54. pycontrails/ext/cirium.py +14 -0
  55. pycontrails/ext/empirical_grid.py +140 -0
  56. pycontrails/ext/synthetic_flight.py +431 -0
  57. pycontrails/models/__init__.py +1 -0
  58. pycontrails/models/accf.py +425 -0
  59. pycontrails/models/apcemm/__init__.py +8 -0
  60. pycontrails/models/apcemm/apcemm.py +983 -0
  61. pycontrails/models/apcemm/inputs.py +226 -0
  62. pycontrails/models/apcemm/static/apcemm_yaml_template.yaml +183 -0
  63. pycontrails/models/apcemm/utils.py +437 -0
  64. pycontrails/models/cocip/__init__.py +29 -0
  65. pycontrails/models/cocip/cocip.py +2742 -0
  66. pycontrails/models/cocip/cocip_params.py +305 -0
  67. pycontrails/models/cocip/cocip_uncertainty.py +291 -0
  68. pycontrails/models/cocip/contrail_properties.py +1530 -0
  69. pycontrails/models/cocip/output_formats.py +2270 -0
  70. pycontrails/models/cocip/radiative_forcing.py +1260 -0
  71. pycontrails/models/cocip/radiative_heating.py +520 -0
  72. pycontrails/models/cocip/unterstrasser_wake_vortex.py +508 -0
  73. pycontrails/models/cocip/wake_vortex.py +396 -0
  74. pycontrails/models/cocip/wind_shear.py +120 -0
  75. pycontrails/models/cocipgrid/__init__.py +9 -0
  76. pycontrails/models/cocipgrid/cocip_grid.py +2552 -0
  77. pycontrails/models/cocipgrid/cocip_grid_params.py +138 -0
  78. pycontrails/models/dry_advection.py +602 -0
  79. pycontrails/models/emissions/__init__.py +21 -0
  80. pycontrails/models/emissions/black_carbon.py +599 -0
  81. pycontrails/models/emissions/emissions.py +1353 -0
  82. pycontrails/models/emissions/ffm2.py +336 -0
  83. pycontrails/models/emissions/static/default-engine-uids.csv +239 -0
  84. pycontrails/models/emissions/static/edb-gaseous-v29b-engines.csv +596 -0
  85. pycontrails/models/emissions/static/edb-nvpm-v29b-engines.csv +215 -0
  86. pycontrails/models/extended_k15.py +1327 -0
  87. pycontrails/models/humidity_scaling/__init__.py +37 -0
  88. pycontrails/models/humidity_scaling/humidity_scaling.py +1075 -0
  89. pycontrails/models/humidity_scaling/quantiles/era5-model-level-quantiles.pq +0 -0
  90. pycontrails/models/humidity_scaling/quantiles/era5-pressure-level-quantiles.pq +0 -0
  91. pycontrails/models/issr.py +210 -0
  92. pycontrails/models/pcc.py +326 -0
  93. pycontrails/models/pcr.py +154 -0
  94. pycontrails/models/ps_model/__init__.py +18 -0
  95. pycontrails/models/ps_model/ps_aircraft_params.py +381 -0
  96. pycontrails/models/ps_model/ps_grid.py +701 -0
  97. pycontrails/models/ps_model/ps_model.py +1000 -0
  98. pycontrails/models/ps_model/ps_operational_limits.py +525 -0
  99. pycontrails/models/ps_model/static/ps-aircraft-params-20250328.csv +69 -0
  100. pycontrails/models/ps_model/static/ps-synonym-list-20250328.csv +104 -0
  101. pycontrails/models/sac.py +442 -0
  102. pycontrails/models/tau_cirrus.py +183 -0
  103. pycontrails/physics/__init__.py +1 -0
  104. pycontrails/physics/constants.py +117 -0
  105. pycontrails/physics/geo.py +1138 -0
  106. pycontrails/physics/jet.py +968 -0
  107. pycontrails/physics/static/iata-cargo-load-factors-20250221.csv +74 -0
  108. pycontrails/physics/static/iata-passenger-load-factors-20250221.csv +74 -0
  109. pycontrails/physics/thermo.py +551 -0
  110. pycontrails/physics/units.py +472 -0
  111. pycontrails/py.typed +0 -0
  112. pycontrails/utils/__init__.py +1 -0
  113. pycontrails/utils/dependencies.py +66 -0
  114. pycontrails/utils/iteration.py +13 -0
  115. pycontrails/utils/json.py +187 -0
  116. pycontrails/utils/temp.py +50 -0
  117. pycontrails/utils/types.py +163 -0
  118. pycontrails-0.59.0.dist-info/METADATA +179 -0
  119. pycontrails-0.59.0.dist-info/RECORD +123 -0
  120. pycontrails-0.59.0.dist-info/WHEEL +6 -0
  121. pycontrails-0.59.0.dist-info/licenses/LICENSE +178 -0
  122. pycontrails-0.59.0.dist-info/licenses/NOTICE +43 -0
  123. pycontrails-0.59.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