Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2012-2026 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file MSCFModel_Rail.h
15 : /// @author Gregor Laemmel
16 : /// @date Tue, 08 Feb 2017
17 : ///
18 : // <description missing>
19 : /****************************************************************************/
20 : #pragma once
21 : #include <config.h>
22 :
23 : #include <utils/common/LinearApproxHelpers.h>
24 : #include "MSCFModel.h"
25 :
26 :
27 :
28 : class MSCFModel_Rail : public MSCFModel {
29 :
30 : public:
31 : /** @brief Constructor
32 : * @param[in] vtype the type for which this model is built and also the parameter object to configure this model
33 : */
34 : MSCFModel_Rail(const MSVehicleType* vtype);
35 :
36 : double followSpeed(const MSVehicle* const veh, double speed, double gap2pred, double predSpeed,
37 : double predMaxDecel, const MSVehicle* const pred = 0, const CalcReason usage = CalcReason::CURRENT) const;
38 :
39 : virtual int getModelID() const;
40 :
41 : virtual MSCFModel* duplicate(const MSVehicleType* vtype) const;
42 :
43 :
44 :
45 : virtual ~MSCFModel_Rail();
46 :
47 : virtual double maxNextSpeed(double speed, const MSVehicle* const veh) const;
48 :
49 : virtual double minNextSpeed(double speed, const MSVehicle* const veh) const;
50 :
51 : virtual double minNextSpeedEmergency(double speed, const MSVehicle* const veh = 0) const;
52 :
53 : double getSpeedAfterMaxDecel(double v) const;
54 :
55 : double finalizeSpeed(MSVehicle* const veh, double vPos) const;
56 :
57 : double freeSpeed(const MSVehicle* const veh, double speed, double seen, double maxSpeed,
58 : const bool onInsertion, const CalcReason usage = CalcReason::CURRENT) const;
59 :
60 13812 : bool startupDelayStopped() const {
61 : // starup delay in trains is dominated by inertia + brake delay and thus applies to any kind of stopping
62 13812 : return true;
63 : }
64 :
65 : private:
66 :
67 390 : struct TrainParams {
68 : // the vehicle mass in tons
69 : double weight; // tons
70 : // the mass factor
71 : double mf;
72 : double length;
73 : double decl;
74 : double vmax;
75 : double recovery;
76 : LinearApproxHelpers::LinearApproxMap traction; // m/s -> kN
77 : LinearApproxHelpers::LinearApproxMap resistance; // m/s -> kN
78 : double maxPower; // kN
79 : double maxTraction; // kN
80 : double resCoef_constant; // kN
81 : double resCoef_linear; // kN / (km/h)
82 : double resCoef_quadratic; // kN / (km/h)^2
83 : //
84 : double curveResistance = 0;
85 : double roeckl_sharp_radius = 300;
86 : double roeckl_numerator = 6380;
87 : double roeckl_numerator_sharp = 4910;
88 : double roeckl_offset = 55;
89 : double roeckl_offset_sharp = 30;
90 :
91 : double getResistance(double speed) const;
92 : double getTraction(double speed) const;
93 : };
94 :
95 : public:
96 : double stopSpeed(const MSVehicle* const veh, const double speed, double gap, double decel, const CalcReason usage = CalcReason::CURRENT) const;
97 :
98 : protected:
99 :
100 : // @return rotational weight in tons
101 : double getRotWeight(const MSVehicle* const veh) const;
102 :
103 : // @brief return weight in tons
104 : double getWeight(const MSVehicle* const veh) const;
105 :
106 : // @brief Röckl formula which returns kN
107 : double getCurveResistance(const MSVehicle* veh) const;
108 :
109 : private:
110 :
111 : TrainParams myTrainParams;
112 :
113 116 : LinearApproxHelpers::LinearApproxMap initNGT400Traction() const { // early version of NGT 400
114 : LinearApproxHelpers::LinearApproxMap map;
115 116 : map[0] = 716.0;
116 116 : map[10] = 700.0;
117 116 : map[20] = 684.0;
118 116 : map[30] = 669.0;
119 116 : map[40] = 653.0;
120 116 : map[50] = 637.0;
121 116 : map[60] = 622.0;
122 116 : map[70] = 606.0;
123 116 : map[80] = 590.0;
124 116 : map[90] = 574.0;
125 116 : map[100] = 559.0;
126 116 : map[110] = 543.0;
127 116 : map[120] = 527.0;
128 116 : map[130] = 507.0;
129 116 : map[140] = 471.0;
130 116 : map[150] = 439.0;
131 116 : map[160] = 412.0;
132 116 : map[170] = 388.0;
133 116 : map[180] = 366.0;
134 116 : map[190] = 347.0;
135 116 : map[200] = 329.0;
136 116 : map[210] = 314.0;
137 116 : map[220] = 299.0;
138 116 : map[230] = 286.0;
139 116 : map[240] = 275.0;
140 116 : map[250] = 264.0;
141 116 : map[260] = 253.0;
142 116 : map[270] = 244.0;
143 116 : map[280] = 235.0;
144 116 : map[290] = 227.0;
145 116 : map[300] = 220.0;
146 116 : map[310] = 213.0;
147 116 : map[320] = 206.0;
148 116 : map[330] = 200.0;
149 116 : map[340] = 194.0;
150 116 : map[350] = 188.0;
151 116 : map[360] = 183.0;
152 116 : map[370] = 178.0;
153 116 : map[380] = 173.0;
154 116 : map[390] = 169.0;
155 116 : map[400] = 165.0;
156 116 : map[410] = 160.6;
157 116 : map[420] = 156.8;
158 116 : map[430] = 153.2;
159 116 : map[440] = 149.7;
160 116 : map[450] = 146.4;
161 116 : map[460] = 143.2;
162 116 : map[470] = 140.1;
163 116 : map[480] = 137.2;
164 116 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
165 116 : return map;
166 : }
167 :
168 116 : LinearApproxHelpers::LinearApproxMap initNGT400Resistance() const { // early version of NGT 400
169 : LinearApproxHelpers::LinearApproxMap map;
170 116 : map[0] = 1.9;
171 116 : map[10] = 2.1;
172 116 : map[20] = 2.4;
173 116 : map[30] = 2.9;
174 116 : map[40] = 3.5;
175 116 : map[50] = 4.2;
176 116 : map[60] = 5.0;
177 116 : map[70] = 6.0;
178 116 : map[80] = 7.0;
179 116 : map[90] = 8.2;
180 116 : map[100] = 9.6;
181 116 : map[110] = 11.0;
182 116 : map[120] = 12.6;
183 116 : map[130] = 14.3;
184 116 : map[140] = 16.1;
185 116 : map[150] = 18.0;
186 116 : map[160] = 20.1;
187 116 : map[170] = 22.3;
188 116 : map[180] = 24.6;
189 116 : map[190] = 27.0;
190 116 : map[200] = 29.5;
191 116 : map[210] = 32.2;
192 116 : map[220] = 35.0;
193 116 : map[230] = 37.9;
194 116 : map[240] = 40.9;
195 116 : map[250] = 44.1;
196 116 : map[260] = 47.4;
197 116 : map[270] = 50.8;
198 116 : map[280] = 54.3;
199 116 : map[290] = 58.0;
200 116 : map[300] = 61.7;
201 116 : map[310] = 65.6;
202 116 : map[320] = 69.7;
203 116 : map[330] = 73.8;
204 116 : map[340] = 78.1;
205 116 : map[350] = 82.4;
206 116 : map[360] = 86.9;
207 116 : map[370] = 91.6;
208 116 : map[380] = 96.3;
209 116 : map[390] = 101.2;
210 116 : map[400] = 106.2;
211 116 : map[410] = 111.3;
212 116 : map[420] = 116.6;
213 116 : map[430] = 121.9;
214 116 : map[440] = 127.4;
215 116 : map[450] = 133.0;
216 116 : map[460] = 138.7;
217 116 : map[470] = 144.6;
218 116 : map[480] = 150.6;
219 116 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
220 116 : return map;
221 : }
222 :
223 116 : TrainParams initNGT400Params() const {
224 : TrainParams params;
225 116 : params.weight = 384;
226 116 : params.mf = 1.04;
227 116 : params.length = 200;
228 116 : params.decl = 0.9;
229 116 : params.vmax = 500 / 3.6;
230 116 : params.recovery = 0.6;
231 116 : params.traction = initNGT400Traction();
232 116 : params.resistance = initNGT400Resistance();
233 116 : return params;
234 0 : }
235 :
236 4 : LinearApproxHelpers::LinearApproxMap initNGT400_16Traction() const {
237 : LinearApproxHelpers::LinearApproxMap map;
238 4 : map[0] = 274.5;
239 4 : map[10] = 274.5;
240 4 : map[20] = 274.5;
241 4 : map[30] = 274.5;
242 4 : map[40] = 274.5;
243 4 : map[50] = 274.5;
244 4 : map[60] = 274.5;
245 4 : map[70] = 274.5;
246 4 : map[80] = 274.5;
247 4 : map[90] = 274.5;
248 4 : map[100] = 274.5;
249 4 : map[110] = 274.5;
250 4 : map[120] = 274.5;
251 4 : map[130] = 274.5;
252 4 : map[140] = 274.5;
253 4 : map[150] = 274.5;
254 4 : map[160] = 274.5;
255 4 : map[170] = 274.5;
256 4 : map[180] = 274.5;
257 4 : map[190] = 274.5;
258 4 : map[200] = 274.5;
259 4 : map[210] = 273;
260 4 : map[220] = 262.3;
261 4 : map[230] = 250;
262 4 : map[240] = 239;
263 4 : map[250] = 229;
264 4 : map[260] = 222;
265 4 : map[270] = 213;
266 4 : map[280] = 205;
267 4 : map[290] = 198;
268 4 : map[300] = 191;
269 4 : map[310] = 186;
270 4 : map[320] = 180;
271 4 : map[330] = 174;
272 4 : map[340] = 169;
273 4 : map[350] = 165;
274 4 : map[360] = 160;
275 4 : map[370] = 155.5;
276 4 : map[380] = 151;
277 4 : map[390] = 148;
278 4 : map[400] = 144;
279 4 : map[410] = 140;
280 4 : map[420] = 136;
281 4 : map[430] = 134;
282 4 : map[440] = 131;
283 4 : map[450] = 128;
284 4 : map[460] = 125;
285 4 : map[470] = 123;
286 4 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
287 4 : return map;
288 : }
289 :
290 4 : LinearApproxHelpers::LinearApproxMap initNGT400_16Resistance() const {
291 : LinearApproxHelpers::LinearApproxMap map;
292 4 : map[0] = 5.71;
293 4 : map[10] = 6.01;
294 4 : map[20] = 6.4;
295 4 : map[30] = 7.0;
296 4 : map[40] = 7.51;
297 4 : map[50] = 8.34;
298 4 : map[60] = 9.2;
299 4 : map[70] = 10.4;
300 4 : map[80] = 11.3;
301 4 : map[90] = 12.58;
302 4 : map[100] = 14.05;
303 4 : map[110] = 15.5;
304 4 : map[120] = 16.9;
305 4 : map[130] = 18.75;
306 4 : map[140] = 20.77;
307 4 : map[150] = 22.9;
308 4 : map[160] = 25.0;
309 4 : map[170] = 26.9;
310 4 : map[180] = 29.38;
311 4 : map[190] = 32.0;
312 4 : map[200] = 34.5;
313 4 : map[210] = 37.0;
314 4 : map[220] = 39.91;
315 4 : map[230] = 43.11;
316 4 : map[240] = 46.4;
317 4 : map[250] = 49.3;
318 4 : map[260] = 52.4;
319 4 : map[270] = 56.09;
320 4 : map[280] = 59.8;
321 4 : map[290] = 63.7;
322 4 : map[300] = 66.8;
323 4 : map[310] = 71.0;
324 4 : map[320] = 75.39;
325 4 : map[330] = 79.9;
326 4 : map[340] = 84.1;
327 4 : map[350] = 87.9;
328 4 : map[360] = 92.7;
329 4 : map[370] = 97.6;
330 4 : map[380] = 102.0;
331 4 : map[390] = 107.0;
332 4 : map[400] = 112.0;
333 4 : map[410] = 117.5;
334 4 : map[420] = 123.0;
335 4 : map[430] = 128.3;
336 4 : map[440] = 133.3;
337 4 : map[450] = 139.2;
338 4 : map[460] = 145.5;
339 4 : map[470] = 150.0;
340 4 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
341 4 : return map;
342 : }
343 :
344 4 : TrainParams initNGT400_16Params() const {
345 : TrainParams params;
346 4 : params.weight = 384;
347 4 : params.mf = 1.04;
348 4 : params.length = 200;
349 4 : params.decl = 0.9;
350 4 : params.vmax = 430 / 3.6;
351 4 : params.recovery = 0.6;
352 4 : params.traction = initNGT400_16Traction();
353 4 : params.resistance = initNGT400_16Resistance();
354 4 : return params;
355 0 : }
356 :
357 9 : LinearApproxHelpers::LinearApproxMap initICE1Traction() const {
358 : LinearApproxHelpers::LinearApproxMap map;
359 9 : map[0] = 400;
360 9 : map[10] = 394;
361 9 : map[20] = 388;
362 9 : map[30] = 382;
363 9 : map[40] = 377;
364 9 : map[50] = 372;
365 9 : map[60] = 369;
366 9 : map[70] = 366;
367 9 : map[80] = 363;
368 9 : map[90] = 361;
369 9 : map[100] = 349;
370 9 : map[110] = 317;
371 9 : map[120] = 290;
372 9 : map[130] = 268;
373 9 : map[140] = 249;
374 9 : map[150] = 232;
375 9 : map[160] = 217;
376 9 : map[170] = 205;
377 9 : map[180] = 193;
378 9 : map[190] = 183;
379 9 : map[200] = 174;
380 9 : map[210] = 165;
381 9 : map[220] = 158;
382 9 : map[230] = 151;
383 9 : map[240] = 145;
384 9 : map[250] = 139;
385 9 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
386 9 : return map;
387 : }
388 :
389 9 : LinearApproxHelpers::LinearApproxMap initICE1Resistance() const {
390 : LinearApproxHelpers::LinearApproxMap map;
391 9 : map[0] = 10.7;
392 9 : map[10] = 12.3;
393 9 : map[20] = 14.2;
394 9 : map[30] = 16.4;
395 9 : map[40] = 18.7;
396 9 : map[50] = 21.3;
397 9 : map[60] = 24.2;
398 9 : map[70] = 27.3;
399 9 : map[80] = 30.6;
400 9 : map[90] = 34.1;
401 9 : map[100] = 37.9;
402 9 : map[110] = 41.9;
403 9 : map[120] = 46.2;
404 9 : map[130] = 50.6;
405 9 : map[140] = 55.4;
406 9 : map[150] = 60.4;
407 9 : map[160] = 65.6;
408 9 : map[170] = 71.1;
409 9 : map[180] = 76.7;
410 9 : map[190] = 82.6;
411 9 : map[200] = 88.8;
412 9 : map[210] = 95.2;
413 9 : map[220] = 101.8;
414 9 : map[230] = 108.7;
415 9 : map[240] = 115.8;
416 9 : map[250] = 123.1;
417 9 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
418 9 : return map;
419 : }
420 :
421 9 : TrainParams initICE1Params() const {
422 : TrainParams params;
423 9 : params.weight = 876;
424 9 : params.mf = 1.1;
425 9 : params.length = 358;
426 9 : params.decl = 0.5;
427 9 : params.vmax = 250 / 3.6;
428 9 : params.recovery = 0.1;
429 9 : params.traction = initICE1Traction();
430 9 : params.resistance = initICE1Resistance();
431 9 : return params;
432 0 : }
433 :
434 5 : TrainParams initICE3Params() const {
435 : TrainParams params;
436 5 : params.weight = 420;
437 5 : params.mf = 1.04;
438 5 : params.length = 200;
439 5 : params.decl = 0.5;
440 5 : params.vmax = 300 / 3.6;
441 5 : params.recovery = 0.6;
442 5 : params.traction = initICE3Traction();
443 5 : params.resistance = initICE3Resistance();
444 5 : return params;
445 0 : }
446 :
447 5 : LinearApproxHelpers::LinearApproxMap initICE3Traction() const {
448 : LinearApproxHelpers::LinearApproxMap map;
449 5 : map[0] = 300;
450 5 : map[10] = 298;
451 5 : map[20] = 297;
452 5 : map[30] = 295;
453 5 : map[40] = 293;
454 5 : map[50] = 292;
455 5 : map[60] = 290;
456 5 : map[70] = 288;
457 5 : map[80] = 286.5;
458 5 : map[90] = 285;
459 5 : map[100] = 283;
460 5 : map[110] = 262;
461 5 : map[120] = 240;
462 5 : map[130] = 221;
463 5 : map[140] = 206;
464 5 : map[150] = 192;
465 5 : map[160] = 180;
466 5 : map[170] = 169;
467 5 : map[180] = 160;
468 5 : map[190] = 152;
469 5 : map[200] = 144;
470 5 : map[210] = 137;
471 5 : map[220] = 131;
472 5 : map[230] = 125;
473 5 : map[240] = 120;
474 5 : map[250] = 115;
475 5 : map[260] = 111;
476 5 : map[270] = 107;
477 5 : map[280] = 103;
478 5 : map[290] = 99;
479 5 : map[300] = 96;
480 5 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
481 5 : return map;
482 : }
483 :
484 5 : LinearApproxHelpers::LinearApproxMap initICE3Resistance() const {
485 : LinearApproxHelpers::LinearApproxMap map;
486 5 : map[0] = 7.4;
487 5 : map[10] = 7.6;
488 5 : map[20] = 8.0;
489 5 : map[30] = 8.4;
490 5 : map[40] = 9.1;
491 5 : map[50] = 9.8;
492 5 : map[60] = 10.7;
493 5 : map[70] = 11.7;
494 5 : map[80] = 12.8;
495 5 : map[90] = 14.1;
496 5 : map[100] = 15.5;
497 5 : map[110] = 17.1;
498 5 : map[120] = 18.8;
499 5 : map[130] = 20.6;
500 5 : map[140] = 22.6;
501 5 : map[150] = 24.6;
502 5 : map[160] = 26.9;
503 5 : map[170] = 29.2;
504 5 : map[180] = 31.7;
505 5 : map[190] = 34.3;
506 5 : map[200] = 37.1;
507 5 : map[210] = 40.0;
508 5 : map[220] = 43.1;
509 5 : map[230] = 46.2;
510 5 : map[240] = 49.6;
511 5 : map[250] = 53.0;
512 5 : map[260] = 56.6;
513 5 : map[270] = 60.3;
514 5 : map[280] = 64.1;
515 5 : map[290] = 68.1;
516 5 : map[300] = 71.8;
517 5 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
518 5 : return map;
519 : }
520 :
521 89 : TrainParams initREDosto7Params() const {
522 : TrainParams params;
523 89 : params.weight = 425.5;
524 89 : params.mf = 1.1;
525 89 : params.length = 207;
526 89 : params.decl = 0.5;
527 89 : params.vmax = 160 / 3.6;
528 89 : params.recovery = 0.1;
529 89 : params.traction = initREDosto7Traction();
530 89 : params.resistance = initREDosto7Resistance();
531 89 : return params;
532 0 : }
533 :
534 89 : LinearApproxHelpers::LinearApproxMap initREDosto7Traction() const {
535 : LinearApproxHelpers::LinearApproxMap map;
536 89 : map[0] = 300;
537 89 : map[10] = 300;
538 89 : map[20] = 300;
539 89 : map[30] = 300;
540 89 : map[40] = 300;
541 89 : map[50] = 300;
542 89 : map[60] = 300;
543 89 : map[70] = 289;
544 89 : map[80] = 253;
545 89 : map[90] = 224;
546 89 : map[100] = 202;
547 89 : map[110] = 183;
548 89 : map[120] = 168;
549 89 : map[130] = 155;
550 89 : map[140] = 144;
551 89 : map[150] = 134;
552 89 : map[160] = 125;
553 89 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
554 89 : return map;
555 : }
556 :
557 89 : LinearApproxHelpers::LinearApproxMap initREDosto7Resistance() const {
558 : LinearApproxHelpers::LinearApproxMap map;
559 89 : map[0] = 8.5;
560 89 : map[10] = 8.9;
561 89 : map[20] = 9.5;
562 89 : map[30] = 10.4;
563 89 : map[40] = 11.4;
564 89 : map[50] = 12.7;
565 89 : map[60] = 14.1;
566 89 : map[70] = 15.8;
567 89 : map[80] = 17.7;
568 89 : map[90] = 19.8;
569 89 : map[100] = 22.6;
570 89 : map[110] = 24.6;
571 89 : map[120] = 27.3;
572 89 : map[130] = 30.2;
573 89 : map[140] = 33.3;
574 89 : map[150] = 36.6;
575 89 : map[160] = 40.2;
576 89 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
577 89 : return map;
578 : }
579 :
580 19 : TrainParams initRB628Params() const {
581 : TrainParams params;
582 19 : params.weight = 72.2;
583 19 : params.mf = 1.04;
584 19 : params.length = 46;
585 19 : params.decl = 0.5;
586 19 : params.vmax = 120 / 3.6;
587 19 : params.recovery = 0;
588 19 : params.traction = initRB628Traction();
589 19 : params.resistance = initRB628Resistance();
590 19 : return params;
591 0 : }
592 :
593 19 : LinearApproxHelpers::LinearApproxMap initRB628Traction() const {
594 : LinearApproxHelpers::LinearApproxMap map;
595 19 : map[0] = 60;
596 19 : map[10] = 53.8;
597 19 : map[20] = 47.6;
598 19 : map[30] = 36.9;
599 19 : map[40] = 28.7;
600 19 : map[50] = 23.5;
601 19 : map[60] = 20.0;
602 19 : map[70] = 17.5;
603 19 : map[80] = 15.2;
604 19 : map[90] = 13.9;
605 19 : map[100] = 12.8;
606 19 : map[110] = 11.7;
607 19 : map[120] = 10.8;
608 19 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
609 19 : return map;
610 : }
611 :
612 19 : LinearApproxHelpers::LinearApproxMap initRB628Resistance() const {
613 : LinearApproxHelpers::LinearApproxMap map;
614 19 : map[0] = 1.29;
615 19 : map[10] = 1.46;
616 19 : map[20] = 1.73;
617 19 : map[30] = 2.08;
618 19 : map[40] = 2.52;
619 19 : map[50] = 3.05;
620 19 : map[60] = 3.66;
621 19 : map[70] = 4.36;
622 19 : map[80] = 5.16;
623 19 : map[90] = 6.03;
624 19 : map[100] = 7.00;
625 19 : map[110] = 8.06;
626 19 : map[120] = 9.2;
627 19 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
628 19 : return map;
629 : }
630 :
631 70 : TrainParams initFreightParams() const {
632 : TrainParams params;
633 70 : params.weight = 1440;
634 70 : params.mf = 1.06;
635 70 : params.length = 512;
636 70 : params.decl = 0.3;
637 70 : params.vmax = 120 / 3.6;
638 70 : params.recovery = 0.05;
639 70 : params.traction = initFreightTraction();
640 70 : params.resistance = initFreightResistance();
641 70 : return params;
642 0 : }
643 :
644 70 : LinearApproxHelpers::LinearApproxMap initFreightTraction() const {
645 : LinearApproxHelpers::LinearApproxMap map;
646 70 : map[0] = 300;
647 70 : map[10] = 296;
648 70 : map[20] = 293;
649 70 : map[30] = 289;
650 70 : map[40] = 286;
651 70 : map[50] = 282;
652 70 : map[60] = 279;
653 70 : map[70] = 275;
654 70 : map[80] = 272;
655 70 : map[90] = 255;
656 70 : map[100] = 230;
657 70 : map[110] = 209;
658 70 : map[120] = 190;//guessed value
659 70 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
660 70 : return map;
661 : }
662 :
663 70 : LinearApproxHelpers::LinearApproxMap initFreightResistance() const {
664 : LinearApproxHelpers::LinearApproxMap map;
665 70 : map[0] = 1.9;
666 70 : map[10] = 4.3;
667 70 : map[20] = 8.5;
668 70 : map[30] = 14.3;
669 70 : map[40] = 21.7;
670 70 : map[50] = 30.8;
671 70 : map[60] = 41.5;
672 70 : map[70] = 53.8;
673 70 : map[80] = 67.8;
674 70 : map[90] = 83.5;
675 70 : map[100] = 110.7;
676 70 : map[110] = 119.6;
677 70 : map[120] = 140.2;
678 70 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
679 70 : return map;
680 : }
681 :
682 58 : LinearApproxHelpers::LinearApproxMap initRB425Traction() const {
683 : LinearApproxHelpers::LinearApproxMap map;
684 58 : map[0] = 150;
685 58 : map[10] = 150;
686 58 : map[20] = 150;
687 58 : map[30] = 150;
688 58 : map[40] = 150;
689 58 : map[50] = 150;
690 58 : map[60] = 140;
691 58 : map[70] = 120;
692 58 : map[80] = 105;
693 58 : map[90] = 93;
694 58 : map[100] = 84;
695 58 : map[110] = 75;
696 58 : map[120] = 70;
697 58 : map[130] = 56;
698 58 : map[140] = 52;
699 58 : map[150] = 46;
700 58 : map[160] = 40;
701 58 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
702 58 : return map;
703 : }
704 :
705 58 : LinearApproxHelpers::LinearApproxMap initRB425Resistance() const {
706 : LinearApproxHelpers::LinearApproxMap map;
707 58 : map[0] = 2.6;
708 58 : map[10] = 2.9;
709 58 : map[20] = 3.3;
710 58 : map[30] = 3.7;
711 58 : map[40] = 4.3;
712 58 : map[50] = 4.9;
713 58 : map[60] = 5.7;
714 58 : map[70] = 6.6;
715 58 : map[80] = 7.5;
716 58 : map[90] = 8.6;
717 58 : map[100] = 9.7;
718 58 : map[110] = 11.0;
719 58 : map[120] = 12.3;
720 58 : map[130] = 13.8;
721 58 : map[140] = 15.3;
722 58 : map[150] = 16.9;
723 58 : map[160] = 18.7;
724 58 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
725 58 : return map;
726 : }
727 :
728 58 : TrainParams initRB425Params() const {
729 : TrainParams params;
730 58 : params.weight = 138;
731 58 : params.mf = 1.04;
732 58 : params.length = 67.5;
733 58 : params.decl = 1.0;
734 58 : params.vmax = 160 / 3.6;
735 58 : params.recovery = 0.6;
736 58 : params.traction = initRB425Traction();
737 58 : params.resistance = initRB425Resistance();
738 58 : return params;
739 0 : }
740 :
741 4 : LinearApproxHelpers::LinearApproxMap initMireoPlusB2TTraction() const {
742 : LinearApproxHelpers::LinearApproxMap map;
743 4 : map[0] = 106.15;
744 4 : map[10] = 106.15;
745 4 : map[20] = 106.15;
746 4 : map[30] = 106.15;
747 4 : map[40] = 106.15;
748 4 : map[50] = 106.15;
749 4 : map[60] = 103.73;
750 4 : map[70] = 88.70;
751 4 : map[80] = 77.47;
752 4 : map[90] = 68.76;
753 4 : map[100] = 61.82;
754 4 : map[110] = 56.15;
755 4 : map[120] = 51.43;
756 4 : map[130] = 47.44;
757 4 : map[140] = 44.03;
758 4 : map[150] = 41.07;
759 4 : map[160] = 38.49;
760 4 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
761 4 : return map;
762 : }
763 :
764 :
765 4 : LinearApproxHelpers::LinearApproxMap initMireoPlusB2TResistance() const {
766 : LinearApproxHelpers::LinearApproxMap map;
767 4 : map[0] = 1.01;
768 4 : map[10] = 1.09;
769 4 : map[20] = 1.27;
770 4 : map[30] = 1.55;
771 4 : map[40] = 1.93;
772 4 : map[50] = 2.41;
773 4 : map[60] = 2.99;
774 4 : map[70] = 3.67;
775 4 : map[80] = 4.46;
776 4 : map[90] = 5.34;
777 4 : map[100] = 6.34;
778 4 : map[110] = 7.44;
779 4 : map[120] = 8.64;
780 4 : map[130] = 9.96;
781 4 : map[140] = 11.38;
782 4 : map[150] = 12.91;
783 4 : map[160] = 14.56;
784 4 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
785 4 : return map;
786 : }
787 :
788 4 : TrainParams initMireoPlusB2TParams() const {
789 : TrainParams params;
790 4 : params.weight = 105.5;
791 4 : params.mf = 1.05;
792 4 : params.length = 46.56;
793 4 : params.decl = 1.1;
794 4 : params.vmax = 160 / 3.6;
795 4 : params.recovery = 0.3;
796 4 : params.traction = initMireoPlusB2TTraction();
797 4 : params.resistance = initMireoPlusB2TResistance();
798 4 : return params;
799 0 : }
800 :
801 4 : LinearApproxHelpers::LinearApproxMap initMireoPlusH2TTraction() const {
802 : LinearApproxHelpers::LinearApproxMap map;
803 4 : map[0] = 104.50;
804 4 : map[10] = 104.50;
805 4 : map[20] = 104.50;
806 4 : map[30] = 104.50;
807 4 : map[40] = 104.50;
808 4 : map[50] = 104.50;
809 4 : map[60] = 102.00;
810 4 : map[70] = 87.43;
811 4 : map[80] = 76.50;
812 4 : map[90] = 68.00;
813 4 : map[100] = 61.20;
814 4 : map[110] = 55.64;
815 4 : map[120] = 51.00;
816 4 : map[130] = 47.08;
817 4 : map[140] = 43.71;
818 4 : map[150] = 40.80;
819 4 : map[160] = 38.25;
820 4 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
821 4 : return map;
822 : }
823 :
824 :
825 4 : LinearApproxHelpers::LinearApproxMap initMireoPlusH2TResistance() const {
826 : LinearApproxHelpers::LinearApproxMap map;
827 4 : map[0] = 1.01;
828 4 : map[10] = 1.09;
829 4 : map[20] = 1.27;
830 4 : map[30] = 1.55;
831 4 : map[40] = 1.93;
832 4 : map[50] = 2.41;
833 4 : map[60] = 2.99;
834 4 : map[70] = 3.67;
835 4 : map[80] = 4.45;
836 4 : map[90] = 5.34;
837 4 : map[100] = 6.34;
838 4 : map[110] = 7.43;
839 4 : map[120] = 8.64;
840 4 : map[130] = 9.95;
841 4 : map[140] = 11.38;
842 4 : map[150] = 12.91;
843 4 : map[160] = 14.56;
844 4 : LinearApproxHelpers::scalePoints(map, 1 / 3.6, 1);
845 4 : return map;
846 : }
847 :
848 4 : TrainParams initMireoPlusH2TParams() const {
849 : TrainParams params;
850 4 : params.weight = 105.4;
851 4 : params.mf = 1.05;
852 4 : params.length = 46.56;
853 4 : params.decl = 1.1;
854 4 : params.vmax = 160 / 3.6;
855 4 : params.recovery = 0.3;
856 4 : params.traction = initMireoPlusH2TTraction();
857 4 : params.resistance = initMireoPlusH2TResistance();
858 4 : return params;
859 0 : }
860 :
861 : TrainParams initCustomParams() const {
862 : TrainParams params;
863 12 : params.weight = 100;
864 12 : params.mf = 1.05;
865 12 : params.length = 100;
866 12 : params.decl = 1;
867 12 : params.vmax = 200 / 3.6;
868 12 : params.recovery = 0.3;
869 : return params;
870 : }
871 : // void initVehicleVariables(const MSVehicle *const pVehicle, MSCFModel_Rail::VehicleVariables *pVariables)const;
872 :
873 : };
|