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