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