SUMO - Simulation of Urban MObility
MSCFModel_Rail.h
Go to the documentation of this file.
1 /****************************************************************************/
7 // <description missing>
8 /****************************************************************************/
9 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
10 // Copyright (C) 2012-2017 DLR (http://www.dlr.de/) and contributors
11 /****************************************************************************/
12 //
13 // This file is part of SUMO.
14 // SUMO is free software: you can redistribute it and/or modify
15 // it under the terms of the GNU General Public License as published by
16 // the Free Software Foundation, either version 3 of the License, or
17 // (at your option) any later version.
18 //
19 /****************************************************************************/
20 #ifndef SUMO_MSCFMODEL_RAIL_H
21 #define SUMO_MSCFMODEL_RAIL_H
22 
23 
24 #include "MSCFModel.h"
25 
26 
27 
28 class MSCFModel_Rail : public MSCFModel {
29 
30 public:
31 
32  double followSpeed(const MSVehicle* const veh, double speed, double gap2pred, double predSpeed,
33  double predMaxDecel) const;
34 
35  virtual int getModelID() const;
36 
37  virtual MSCFModel* duplicate(const MSVehicleType* vtype) const;
38 
42  MSCFModel_Rail(const MSVehicleType* vtype, std::string trainType);
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  double getSpeedAfterMaxDecel(double v) const;
52 
54 
55  double moveHelper(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;
59 
60 private:
61 
62 
63  typedef std::map<double, double> LookUpMap;
64 
65  struct TrainParams {
66  double weight;
67  double mf;
68  double length;
69  double decl;
70  double vmax;
71  double recovery;
72  double rotWeight;
73  LookUpMap traction;
74  LookUpMap resistance;
75  };
76 
77  double getInterpolatedValueFromLookUpMap(double speed, const LookUpMap* lookUpMap) const;
78 
79 
80 public:
81  double stopSpeed(const MSVehicle* const veh, const double speed, double gap) const;
82 
83 // class VehicleVariables : public MSCFModel::VehicleVariables {
84 //
85 // public:
86 //
87 // const std::string getTrainType() const { return myTrainType; };
88 //
89 // void setTrainType(std::string trainType) { myTrainType = trainType; }
90 //
91 // bool isNotYetInitialized() {
92 // return notYetInitialized;
93 // }
94 //
95 // void setInitialized() {
96 // notYetInitialized = false;
97 // }
98 //
99 // private:
100 // std::string myTrainType;
101 // bool notYetInitialized = true;
102 //
103 //
104 // };
105 
106 private:
107 
108 
110 
111  LookUpMap initNGT400Traction() const { // early version of NGT 400
112  LookUpMap map;
113  map[0] = 716.0;
114  map[10] = 700.0;
115  map[20] = 684.0;
116  map[30] = 669.0;
117  map[40] = 653.0;
118  map[50] = 637.0;
119  map[60] = 622.0;
120  map[70] = 606.0;
121  map[80] = 590.0;
122  map[90] = 574.0;
123  map[100] = 559.0;
124  map[110] = 543.0;
125  map[120] = 527.0;
126  map[130] = 507.0;
127  map[140] = 471.0;
128  map[150] = 439.0;
129  map[160] = 412.0;
130  map[170] = 388.0;
131  map[180] = 366.0;
132  map[190] = 347.0;
133  map[200] = 329.0;
134  map[210] = 314.0;
135  map[220] = 299.0;
136  map[230] = 286.0;
137  map[240] = 275.0;
138  map[250] = 264.0;
139  map[260] = 253.0;
140  map[270] = 244.0;
141  map[280] = 235.0;
142  map[290] = 227.0;
143  map[300] = 220.0;
144  map[310] = 213.0;
145  map[320] = 206.0;
146  map[330] = 200.0;
147  map[340] = 194.0;
148  map[350] = 188.0;
149  map[360] = 183.0;
150  map[370] = 178.0;
151  map[380] = 173.0;
152  map[390] = 169.0;
153  map[400] = 165.0;
154  map[410] = 160.6;
155  map[420] = 156.8;
156  map[430] = 153.2;
157  map[440] = 149.7;
158  map[450] = 146.4;
159  map[460] = 143.2;
160  map[470] = 140.1;
161  map[480] = 137.2;
162  return map;
163  }
164 
165  LookUpMap initNGT400Resistance() const { // early version of NGT 400
166  LookUpMap map;
167  map[0] = 1.9;
168  map[10] = 2.1;
169  map[20] = 2.4;
170  map[30] = 2.9;
171  map[40] = 3.5;
172  map[50] = 4.2;
173  map[60] = 5.0;
174  map[70] = 6.0;
175  map[80] = 7.0;
176  map[90] = 8.2;
177  map[100] = 9.6;
178  map[110] = 11.0;
179  map[120] = 12.6;
180  map[130] = 14.3;
181  map[140] = 16.1;
182  map[150] = 18.0;
183  map[160] = 20.1;
184  map[170] = 22.3;
185  map[180] = 24.6;
186  map[190] = 27.0;
187  map[200] = 29.5;
188  map[210] = 32.2;
189  map[220] = 35.0;
190  map[230] = 37.9;
191  map[240] = 40.9;
192  map[250] = 44.1;
193  map[260] = 47.4;
194  map[270] = 50.8;
195  map[280] = 54.3;
196  map[290] = 58.0;
197  map[300] = 61.7;
198  map[310] = 65.6;
199  map[320] = 69.7;
200  map[330] = 73.8;
201  map[340] = 78.1;
202  map[350] = 82.4;
203  map[360] = 86.9;
204  map[370] = 91.6;
205  map[380] = 96.3;
206  map[390] = 101.2;
207  map[400] = 106.2;
208  map[410] = 111.3;
209  map[420] = 116.6;
210  map[430] = 121.9;
211  map[440] = 127.4;
212  map[450] = 133.0;
213  map[460] = 138.7;
214  map[470] = 144.6;
215  map[480] = 150.6;
216  return map;
217  }
218 
220  TrainParams params;
221  params.weight = 384;
222  params.mf = 1.04;
223  params.length = 200;
224  params.decl = 0.9;
225  params.vmax = 500 / 3.6;
226  params.recovery = 0.6;
227  params.rotWeight = params.weight * params.mf;
228  params.traction = initNGT400Traction();
229  params.resistance = initNGT400Resistance();
230  return params;
231  }
232 
233  LookUpMap initNGT400_16Traction() const {
234  LookUpMap map;
235  map[0] = 274.5;
236  map[10] = 274.5;
237  map[20] = 274.5;
238  map[30] = 274.5;
239  map[40] = 274.5;
240  map[50] = 274.5;
241  map[60] = 274.5;
242  map[70] = 274.5;
243  map[80] = 274.5;
244  map[90] = 274.5;
245  map[100] = 274.5;
246  map[110] = 274.5;
247  map[120] = 274.5;
248  map[130] = 274.5;
249  map[140] = 274.5;
250  map[150] = 274.5;
251  map[160] = 274.5;
252  map[170] = 274.5;
253  map[180] = 274.5;
254  map[190] = 274.5;
255  map[200] = 274.5;
256  map[210] = 273;
257  map[220] = 262.3;
258  map[230] = 250;
259  map[240] = 239;
260  map[250] = 229;
261  map[260] = 222;
262  map[270] = 213;
263  map[280] = 205;
264  map[290] = 198;
265  map[300] = 191;
266  map[310] = 186;
267  map[320] = 180;
268  map[330] = 174;
269  map[340] = 169;
270  map[350] = 165;
271  map[360] = 160;
272  map[370] = 155.5;
273  map[380] = 151;
274  map[390] = 148;
275  map[400] = 144;
276  map[410] = 140;
277  map[420] = 136;
278  map[430] = 134;
279  map[440] = 131;
280  map[450] = 128;
281  map[460] = 125;
282  map[470] = 123;
283  return map;
284  }
285 
286  LookUpMap initNGT400_16Resistance() const {
287  LookUpMap map;
288  map[0] = 5.71;
289  map[10] = 6.01;
290  map[20] = 6.4;
291  map[30] = 7.0;
292  map[40] = 7.51;
293  map[50] = 8.34;
294  map[60] = 9.2;
295  map[70] = 10.4;
296  map[80] = 11.3;
297  map[90] = 12.58;
298  map[100] = 14.05;
299  map[110] = 15.5;
300  map[120] = 16.9;
301  map[130] = 18.75;
302  map[140] = 20.77;
303  map[150] = 22.9;
304  map[160] = 25.0;
305  map[170] = 26.9;
306  map[180] = 29.38;
307  map[190] = 32.0;
308  map[200] = 34.5;
309  map[210] = 37.0;
310  map[220] = 39.91;
311  map[230] = 43.11;
312  map[240] = 46.4;
313  map[250] = 49.3;
314  map[260] = 52.4;
315  map[270] = 56.09;
316  map[280] = 59.8;
317  map[290] = 63.7;
318  map[300] = 66.8;
319  map[310] = 71.0;
320  map[320] = 75.39;
321  map[330] = 79.9;
322  map[340] = 84.1;
323  map[350] = 87.9;
324  map[360] = 92.7;
325  map[370] = 97.6;
326  map[380] = 102.0;
327  map[390] = 107.0;
328  map[400] = 112.0;
329  map[410] = 117.5;
330  map[420] = 123.0;
331  map[430] = 128.3;
332  map[440] = 133.3;
333  map[450] = 139.2;
334  map[460] = 145.5;
335  map[470] = 150.0;
336  return map;
337  }
338 
340  TrainParams params;
341  params.weight = 384;
342  params.mf = 1.04;
343  params.length = 200;
344  params.decl = 0.9;
345  params.vmax = 430 / 3.6;
346  params.recovery = 0.6;
347  params.rotWeight = params.weight * params.mf;
348  params.traction = initNGT400_16Traction();
350  return params;
351  }
352 
353  LookUpMap initICE1Traction() const {
354  LookUpMap map;
355  map[0] = 400;
356  map[10] = 394;
357  map[20] = 388;
358  map[30] = 382;
359  map[40] = 377;
360  map[50] = 372;
361  map[60] = 369;
362  map[70] = 366;
363  map[80] = 363;
364  map[90] = 361;
365  map[100] = 349;
366  map[110] = 317;
367  map[120] = 290;
368  map[130] = 268;
369  map[140] = 249;
370  map[150] = 232;
371  map[160] = 217;
372  map[170] = 205;
373  map[180] = 193;
374  map[190] = 183;
375  map[200] = 174;
376  map[210] = 165;
377  map[220] = 158;
378  map[230] = 151;
379  map[240] = 145;
380  map[250] = 139;
381  return map;
382  }
383 
384  LookUpMap initICE1Resistance() const {
385  LookUpMap map;
386  map[0] = 10.7;
387  map[10] = 12.3;
388  map[20] = 14.2;
389  map[30] = 16.4;
390  map[40] = 18.7;
391  map[50] = 21.3;
392  map[60] = 24.2;
393  map[70] = 27.3;
394  map[80] = 30.6;
395  map[90] = 34.1;
396  map[100] = 37.9;
397  map[110] = 41.9;
398  map[120] = 46.2;
399  map[130] = 50.6;
400  map[140] = 55.4;
401  map[150] = 60.4;
402  map[160] = 65.6;
403  map[170] = 71.1;
404  map[180] = 76.7;
405  map[190] = 82.6;
406  map[200] = 88.8;
407  map[210] = 95.2;
408  map[220] = 101.8;
409  map[230] = 108.7;
410  map[240] = 115.8;
411  map[250] = 123.1;
412  return map;
413  }
414 
416  TrainParams params;
417  params.weight = 876;
418  params.mf = 1.1;
419  params.length = 358;
420  params.decl = 0.5;
421  params.vmax = 250 / 3.6;
422  params.recovery = 0.1;
423  params.rotWeight = params.weight * params.mf;
424  params.traction = initICE1Traction();
425  params.resistance = initICE1Resistance();
426  return params;
427  }
428 
430  TrainParams params;
431  params.weight = 420;
432  params.mf = 1.04;
433  params.length = 200;
434  params.decl = 0.5;
435  params.vmax = 300 / 3.6;
436  params.recovery = 0.6;
437  params.rotWeight = params.weight * params.mf;
438  params.traction = initICE3Traction();
439  params.resistance = initICE3Resistance();
440  return params;
441  }
442 
443  LookUpMap initICE3Traction() const {
444  LookUpMap map;
445  map[0] = 300;
446  map[10] = 298;
447  map[20] = 297;
448  map[30] = 295;
449  map[40] = 293;
450  map[50] = 292;
451  map[60] = 290;
452  map[70] = 288;
453  map[80] = 286.5;
454  map[90] = 285;
455  map[100] = 283;
456  map[110] = 262;
457  map[120] = 240;
458  map[130] = 221;
459  map[140] = 206;
460  map[150] = 192;
461  map[160] = 180;
462  map[170] = 169;
463  map[180] = 160;
464  map[190] = 152;
465  map[200] = 144;
466  map[210] = 137;
467  map[220] = 131;
468  map[230] = 125;
469  map[240] = 120;
470  map[250] = 115;
471  map[260] = 111;
472  map[270] = 107;
473  map[280] = 103;
474  map[290] = 99;
475  map[300] = 96;
476  return map;
477  }
478 
479  LookUpMap initICE3Resistance() const {
480  LookUpMap map;
481  map[0] = 7.4;
482  map[10] = 7.6;
483  map[20] = 8.0;
484  map[30] = 8.4;
485  map[40] = 9.1;
486  map[50] = 9.8;
487  map[60] = 10.7;
488  map[70] = 11.7;
489  map[80] = 12.8;
490  map[90] = 14.1;
491  map[100] = 15.5;
492  map[110] = 17.1;
493  map[120] = 18.8;
494  map[130] = 20.6;
495  map[140] = 22.6;
496  map[150] = 24.6;
497  map[160] = 26.9;
498  map[170] = 29.2;
499  map[180] = 31.7;
500  map[190] = 34.3;
501  map[200] = 37.1;
502  map[210] = 40.0;
503  map[220] = 43.1;
504  map[230] = 46.2;
505  map[240] = 49.6;
506  map[250] = 53.0;
507  map[260] = 56.6;
508  map[270] = 60.3;
509  map[280] = 64.1;
510  map[290] = 68.1;
511  map[300] = 71.8;
512  return map;
513  }
514 
516  TrainParams params;
517  params.weight = 425.5;
518  params.mf = 1.1;
519  params.length = 207;
520  params.decl = 0.5;
521  params.vmax = 160 / 3.6;
522  params.recovery = 0.1;
523  params.rotWeight = params.weight * params.mf;
524  params.traction = initREDosto7Traction();
526  return params;
527  }
528 
529  LookUpMap initREDosto7Traction() const {
530  LookUpMap map;
531  map[0] = 300;
532  map[10] = 300;
533  map[20] = 300;
534  map[30] = 300;
535  map[40] = 300;
536  map[50] = 300;
537  map[60] = 300;
538  map[70] = 289;
539  map[80] = 253;
540  map[90] = 224;
541  map[100] = 202;
542  map[110] = 183;
543  map[120] = 168;
544  map[130] = 155;
545  map[140] = 144;
546  map[150] = 134;
547  map[160] = 125;
548  return map;
549  }
550 
551  LookUpMap initREDosto7Resistance() const {
552  LookUpMap map;
553  map[0] = 8.5;
554  map[10] = 8.9;
555  map[20] = 9.5;
556  map[30] = 10.4;
557  map[40] = 11.4;
558  map[50] = 12.7;
559  map[60] = 14.1;
560  map[70] = 15.8;
561  map[80] = 17.7;
562  map[90] = 19.8;
563  map[100] = 22.6;
564  map[110] = 24.6;
565  map[120] = 27.3;
566  map[130] = 30.2;
567  map[140] = 33.3;
568  map[150] = 36.6;
569  map[160] = 40.2;
570  return map;
571  }
572 
574  TrainParams params;
575  params.weight = 72.2;
576  params.mf = 1.04;
577  params.length = 46;
578  params.decl = 0.5;
579  params.vmax = 120 / 3.6;
580  params.recovery = 0;
581  params.rotWeight = params.weight * params.mf;
582  params.traction = initRB628Traction();
583  params.resistance = initRB628Resistance();
584  return params;
585  }
586 
587  LookUpMap initRB628Traction() const {
588  LookUpMap map;
589  map[0] = 60;
590  map[10] = 53.8;
591  map[20] = 47.6;
592  map[30] = 36.9;
593  map[40] = 28.7;
594  map[50] = 23.5;
595  map[60] = 20.0;
596  map[70] = 17.5;
597  map[80] = 15.2;
598  map[90] = 13.9;
599  map[100] = 12.8;
600  map[110] = 11.7;
601  map[120] = 10.8;
602  return map;
603  }
604 
605  LookUpMap initRB628Resistance() const {
606  LookUpMap map;
607  map[0] = 1.29;
608  map[10] = 1.46;
609  map[20] = 1.73;
610  map[30] = 2.08;
611  map[40] = 2.52;
612  map[50] = 3.05;
613  map[60] = 3.66;
614  map[70] = 4.36;
615  map[80] = 5.16;
616  map[90] = 6.03;
617  map[100] = 7.00;
618  map[110] = 8.06;
619  map[120] = 9.2;
620  return map;
621  }
622 
624  TrainParams params;
625  params.weight = 1440;
626  params.mf = 1.06;
627  params.length = 512;
628  params.decl = 0.3;
629  params.vmax = 120 / 3.6;
630  params.recovery = 0.05;
631  params.rotWeight = params.weight * params.mf;
632  params.traction = initFreightTraction();
634  return params;
635  }
636 
637  LookUpMap initFreightTraction() const {
638  LookUpMap map;
639  map[0] = 300;
640  map[10] = 296;
641  map[20] = 293;
642  map[30] = 289;
643  map[40] = 286;
644  map[50] = 282;
645  map[60] = 279;
646  map[70] = 275;
647  map[80] = 272;
648  map[90] = 255;
649  map[100] = 230;
650  map[110] = 209;
651  map[120] = 190;//guessed value
652  return map;
653  }
654 
655  LookUpMap initFreightResistance() const {
656  LookUpMap map;
657  map[0] = 1.9;
658  map[10] = 4.3;
659  map[20] = 8.5;
660  map[30] = 14.3;
661  map[40] = 21.7;
662  map[50] = 30.8;
663  map[60] = 41.5;
664  map[70] = 53.8;
665  map[80] = 67.8;
666  map[90] = 83.5;
667  map[100] = 110.7;
668  map[110] = 119.6;
669  map[120] = 140.2;
670  return map;
671  }
672 
673  LookUpMap initRB425Traction() const {
674  LookUpMap map;
675  map[0] = 150;
676  map[10] = 150;
677  map[20] = 150;
678  map[30] = 150;
679  map[40] = 150;
680  map[50] = 150;
681  map[60] = 140;
682  map[70] = 120;
683  map[80] = 105;
684  map[90] = 93;
685  map[100] = 84;
686  map[110] = 75;
687  map[120] = 70;
688  map[130] = 56;
689  map[140] = 52;
690  map[150] = 46;
691  map[160] = 40;
692  return map;
693  }
694 
695  LookUpMap initRB425Resistance() const {
696  LookUpMap map;
697  map[0] = 2.6;
698  map[10] = 2.9;
699  map[20] = 3.3;
700  map[30] = 3.7;
701  map[40] = 4.3;
702  map[50] = 4.9;
703  map[60] = 5.7;
704  map[70] = 6.6;
705  map[80] = 7.5;
706  map[90] = 8.6;
707  map[100] = 9.7;
708  map[110] = 11.0;
709  map[120] = 12.3;
710  map[130] = 13.8;
711  map[140] = 15.3;
712  map[150] = 16.9;
713  map[160] = 18.7;
714  return map;
715  }
716 
718  TrainParams params;
719  params.weight = 138;
720  params.mf = 1.04;
721  params.length = 67.5;
722  params.decl = 1.0;
723  params.vmax = 160 / 3.6;
724  params.recovery = 0.6;
725  params.rotWeight = params.weight * params.mf;
726  params.traction = initRB425Traction();
727  params.resistance = initRB425Resistance();
728  return params;
729  }
730 
731 // void initVehicleVariables(const MSVehicle *const pVehicle, MSCFModel_Rail::VehicleVariables *pVariables)const;
732 
733 };
734 
735 
736 #endif //SUMO_MSCFMODEL_RAIL_H
virtual MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:83
TrainParams initFreightParams() const
LookUpMap initICE3Resistance() 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...
LookUpMap initICE1Resistance() const
The car-following model abstraction.
Definition: MSCFModel.h:60
TrainParams initRB628Params() const
std::map< double, double > LookUpMap
MSCFModel::VehicleVariables * createVehicleVariables() const
Returns model specific values which are stored inside a vehicle and must be used with casting...
virtual int getModelID() const
Returns the model&#39;s ID; the XML-Tag number is used.
LookUpMap initNGT400_16Resistance() const
TrainParams initRB425Params() const
LookUpMap initNGT400Resistance() const
The car-following model and parameter.
Definition: MSVehicleType.h:74
LookUpMap initREDosto7Resistance() const
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
LookUpMap initNGT400_16Traction() const
LookUpMap initRB425Resistance() const
TrainParams initNGT400Params() const
LookUpMap initRB628Traction() const
LookUpMap initFreightTraction() const
LookUpMap initRB425Traction() const
TrainParams initNGT400_16Params() const
TrainParams initICE1Params() const
double getSpeedAfterMaxDecel(double v) const
Returns the velocity after maximum deceleration.
virtual ~MSCFModel_Rail()
double freeSpeed(const MSVehicle *const veh, double speed, double seen, double maxSpeed, const bool onInsertion) const
Computes the vehicle&#39;s safe speed without a leader.
double stopSpeed(const MSVehicle *const veh, const double speed, double gap) const
Computes the vehicle&#39;s safe speed for approaching a non-moving obstacle (no dawdling) ...
TrainParams initICE3Params() const
TrainParams myTrainParams
double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
double getInterpolatedValueFromLookUpMap(double speed, const LookUpMap *lookUpMap) const
double followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const
Computes the vehicle&#39;s follow speed (no dawdling)
LookUpMap initNGT400Traction() const
LookUpMap initFreightResistance() const
MSCFModel_Rail(const MSVehicleType *vtype, std::string trainType)
Constructor.
TrainParams initREDosto7Params() const
LookUpMap initICE1Traction() const
LookUpMap initRB628Resistance() const
LookUpMap initREDosto7Traction() const
LookUpMap initICE3Traction() const