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