Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
junzis
GitHub Repository: junzis/openap
Path: blob/master/scripts/gen_engine_data_v27.py
592 views
1
import os
2
import pandas as pd
3
import numpy as np
4
import argparse
5
import matplotlib.pyplot as plt
6
from scipy.optimize import curve_fit
7
8
9
def clean_name(name):
10
if "SelectOne" in name:
11
name = name.split(" ")[0].strip()
12
elif "Build Spec" in name:
13
name = name.split(" ")[0].strip()
14
elif "Block" in name:
15
name = name.split(" ")[0].strip()
16
elif "series" in name:
17
name = name.split(" ")[0].strip()
18
elif "(" in name:
19
name = name.split("(")[0].strip()
20
return name
21
22
23
def clean_bpr(bpr):
24
try:
25
bpr = float(bpr)
26
except (ValueError, TypeError):
27
bpr = "-"
28
return bpr
29
30
31
f = "input/edb-emissions-databank v27 (web).xlsx"
32
33
xl = pd.ExcelFile(f)
34
35
df0 = xl.parse(sheet_name=2)
36
37
df0.dropna(subset=["UID"], inplace=True)
38
39
df = df0.iloc[
40
1:,
41
[
42
0,
43
1,
44
3,
45
4,
46
5,
47
6,
48
11,
49
12,
50
17,
51
19,
52
22,
53
23,
54
24,
55
25,
56
35,
57
36,
58
37,
59
38,
60
48,
61
49,
62
50,
63
51,
64
80,
65
81,
66
82,
67
83,
68
84,
69
94,
70
],
71
]
72
df.columns = [
73
"uid",
74
"name",
75
"type",
76
"bpr",
77
"pr",
78
"max_thrust",
79
"superseded",
80
"superseded_by",
81
"out_production",
82
"out_service",
83
"ei_hc_to",
84
"ei_hc_co",
85
"ei_hc_app",
86
"ei_hc_idl",
87
"ei_co_to",
88
"ei_co_co",
89
"ei_co_app",
90
"ei_co_idl",
91
"ei_nox_to",
92
"ei_nox_co",
93
"ei_nox_app",
94
"ei_nox_idl",
95
"ff_to",
96
"ff_co",
97
"ff_app",
98
"ff_idl",
99
"fuel_lto",
100
"manufacturer",
101
]
102
103
df.dropna(subset=["name"], inplace=True)
104
105
df.loc[:, "uid"] = df["uid"].str.strip()
106
df.loc[:, "name"] = df["name"].str.strip()
107
df.loc[:, "name"] = df["name"].apply(clean_name)
108
109
df.loc[:, "bpr"] = df["bpr"].apply(clean_bpr)
110
111
df.loc[:, "max_thrust"] = (df["max_thrust"] * 1000).astype(int)
112
113
df = df[df["superseded"] != "x"]
114
df = df[df["uid"] != ""]
115
df = df[df["bpr"] != "-"]
116
df = df[df["ei_hc_to"] != "-"]
117
df = df[df["ei_hc_co"] != "-"]
118
df = df[df["ei_hc_app"] != "-"]
119
df = df[df["ei_hc_idl"] != "-"]
120
df = df[df["ei_hc_to"] != "*"]
121
df = df[df["ei_hc_co"] != "*"]
122
df = df[df["ei_hc_app"] != "*"]
123
df = df[df["ei_hc_idl"] != "*"]
124
df = df[df["ei_co_to"] != "-"]
125
df = df[df["ei_co_co"] != "-"]
126
df = df[df["ei_co_app"] != "-"]
127
df = df[df["ei_co_idl"] != "-"]
128
df = df[df["ei_co_to"] != "*"]
129
df = df[df["ei_co_co"] != "*"]
130
df = df[df["ei_co_app"] != "*"]
131
df = df[df["ei_co_idl"] != "*"]
132
df = df[df["ei_nox_to"] != "-"]
133
df = df[df["ei_nox_co"] != "-"]
134
df = df[df["ei_nox_app"] != "-"]
135
df = df[df["ei_nox_idl"] != "-"]
136
df = df[df["ei_nox_to"] != "*"]
137
df = df[df["ei_nox_co"] != "*"]
138
df = df[df["ei_nox_app"] != "*"]
139
df = df[df["ei_nox_idl"] != "*"]
140
df = df[df["ff_to"] != "-"]
141
df = df[df["ff_co"] != "-"]
142
df = df[df["ff_app"] != "-"]
143
df = df[df["ff_idl"] != "-"]
144
df = df[df["fuel_lto"] != "-"]
145
146
df.drop_duplicates(subset=["name"], keep="last", inplace=True)
147
148
# Die supersededs vinden we nu niet meer interessant
149
df = df.loc[
150
:,
151
[
152
"uid",
153
"name",
154
"manufacturer",
155
"type",
156
"bpr",
157
"pr",
158
"max_thrust",
159
"ei_hc_to",
160
"ei_hc_co",
161
"ei_hc_app",
162
"ei_hc_idl",
163
"ei_co_to",
164
"ei_co_co",
165
"ei_co_app",
166
"ei_co_idl",
167
"ei_nox_to",
168
"ei_nox_co",
169
"ei_nox_app",
170
"ei_nox_idl",
171
"ff_to",
172
"ff_co",
173
"ff_app",
174
"ff_idl",
175
"fuel_lto",
176
],
177
]
178
179
180
def func_fuel3(x, c3, c2, c1, c0):
181
return c3 * x ** 3 + c2 * x ** 2 + c1 * x + c0
182
183
184
def func_fuel2(x, a, b):
185
return a * (x + b) ** 2
186
187
188
# def func_fuel(x, c1, c2):
189
# return c1 * np.exp(c2 * x)
190
191
192
# compute fuel flow coefficient
193
x = [0.07, 0.3, 0.85, 1.0]
194
for i, r in df.iterrows():
195
y = [r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]
196
197
# coef = np.polyfit(x, y, 2)
198
# df.loc[i, 'fuel_c2'] = coef[0]
199
# df.loc[i, 'fuel_c1'] = coef[1]
200
# df.loc[i, 'fuel_c0'] = coef[2]
201
202
coef, cov = curve_fit(func_fuel3, x, y)
203
df.loc[i, "fuel_c3"] = coef[0]
204
df.loc[i, "fuel_c2"] = coef[1]
205
df.loc[i, "fuel_c1"] = coef[2]
206
207
coef, cov = curve_fit(func_fuel2, x, y)
208
df.loc[i, "fuel_a"] = coef[0]
209
df.loc[i, "fuel_b"] = coef[1]
210
211
# print(r["name"], coef)
212
# xx = np.linspace(-1, 1, 100)
213
# plt.plot(xx, func_fuel(xx, *coef))
214
# plt.scatter(x, y)
215
# plt.draw()
216
# plt.waitforbuttonpress(-1)
217
# plt.clf()
218
219
220
dfcr = pd.read_csv("input/engine_cruise_performance.csv")
221
df = df.merge(dfcr, how="left", left_on="name", right_on="engine")
222
df = df.drop("engine", axis=1)
223
224
225
# def func_co(x, beta, gamma):
226
# return beta * (x - 0.001) ** (-gamma) * np.exp(-2 * (x - 0.001) ** beta)
227
228
229
# def func_nox(x, c1, p1):
230
# return c1 * x ** p1
231
232
233
# def func_hc(x, beta, gamma):
234
# return beta * (x + 0.05) ** (-gamma) * np.exp(-4 * (x - 0.001) ** beta)
235
236
237
# for i, r in df.iterrows():
238
239
# # process NOx
240
# x_nox = [0, r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]
241
# y_nox = [0, r["ei_nox_idl"], r["ei_nox_app"], r["ei_nox_co"], r["ei_nox_to"]]
242
243
# guess = np.array([20, 0.75])
244
# coef_nox, cov = curve_fit(func_nox, x_nox, y_nox, guess)
245
246
# df.loc[i, "nox_c"] = coef_nox[0]
247
# df.loc[i, "nox_p"] = coef_nox[1]
248
249
# # process CO
250
# x_co = [r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]
251
# y_co = [r["ei_co_idl"], r["ei_co_app"], r["ei_co_co"], r["ei_co_to"]]
252
# y_co = np.maximum(y_co, [1e-7, 1e-7, 1e-7, 1e-7])
253
254
# coef_co, covco = curve_fit(func_co, x_co[0:2], y_co[0:2])
255
# df.loc[i, "co_beta"] = coef_co[0]
256
# df.loc[i, "co_gamma"] = coef_co[1]
257
# df.loc[i, "co_max"] = 2 * y_co[0]
258
# df.loc[i, "co_min"] = (y_co[2] + y_co[3]) / 2
259
260
# # process HC
261
# x_hc = [r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]
262
# y_hc = [r["ei_hc_idl"], r["ei_hc_app"], r["ei_hc_co"], r["ei_hc_to"]]
263
264
# if max(y_hc) == 0:
265
# df.loc[i, "hc_na"] = True
266
# else:
267
# df.loc[i, "hc_na"] = False
268
269
# df.loc[i, "hc_max"] = 2 * max(y_hc[0], y_hc[1])
270
# df.loc[i, "hc_min"] = (y_hc[2] + y_hc[3]) / 2
271
272
# y_hc = np.maximum(y_hc, [1e-7, 1e-7, 1e-7, 1e-7])
273
274
# logX, logY = np.log10(x_hc), np.log10(y_hc) # current powers
275
# b2 = (logY[3] + logY[2]) / 2 # Average power
276
# a1 = (logY[1] - logY[0]) / (logX[1] - logX[0])
277
# b1 = logY[0] - a1 * logX[0]
278
279
# x_intersect = 10 ** ((b2 - b1) / a1)
280
# if x_intersect > x_hc[2]:
281
# df.loc[i, "hc_ff85"] = x_hc[2]
282
# else:
283
# df.loc[i, "hc_ff85"] = 0
284
285
# try:
286
# coef_hc, covhc = curve_fit(func_hc, x_hc, y_hc)
287
# df.loc[i, "hc_beta"] = coef_hc[0]
288
# df.loc[i, "hc_gamma"] = coef_hc[1]
289
# df.loc[i, "hc_a1"] = None
290
# df.loc[i, "hc_b1"] = None
291
# df.loc[i, "hc_b2"] = None
292
# except RuntimeError:
293
# df.loc[i, "hc_beta"] = None
294
# df.loc[i, "hc_gamma"] = None
295
# df.loc[i, "hc_a1"] = a1
296
# df.loc[i, "hc_b1"] = b1
297
# df.loc[i, "hc_b2"] = b2
298
299
300
df.to_csv("db/engines.csv", float_format="%g", index=False)
301
302