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
LookUpMap initNGT400Resistance() const
LookUpMap initICE3Resistance() const
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:83
TrainParams initRB425Params() const
TrainParams initICE1Params() const
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) ...
MSCFModel::VehicleVariables * createVehicleVariables() const
Returns model specific values which are stored inside a vehicle and must be used with casting...
The car-following model abstraction.
Definition: MSCFModel.h:60
virtual MSCFModel * duplicate(const MSVehicleType *vtype) const
Duplicates the car-following model.
virtual double maxNextSpeed(double speed, const MSVehicle *const veh) const
Returns the maximum speed given the current speed.
LookUpMap initNGT400_16Traction() const
LookUpMap initNGT400_16Resistance() const
std::map< double, double > LookUpMap
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 initREDosto7Resistance() const
TrainParams initICE3Params() const
LookUpMap initRB628Traction() const
LookUpMap initICE3Traction() const
TrainParams initNGT400_16Params() const
LookUpMap initREDosto7Traction() const
double getSpeedAfterMaxDecel(double v) const
Returns the velocity after maximum deceleration.
The car-following model and parameter.
Definition: MSVehicleType.h:74
double moveHelper(MSVehicle *const veh, double vPos) const
Applies interaction with stops and lane changing model influences.
TrainParams initREDosto7Params() const
TrainParams initNGT400Params() const
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 followSpeed(const MSVehicle *const veh, double speed, double gap2pred, double predSpeed, double predMaxDecel) const
Computes the vehicle&#39;s follow speed (no dawdling)
TrainParams initRB628Params() const
LookUpMap initICE1Traction() const
LookUpMap initRB628Resistance() const
virtual ~MSCFModel_Rail()
TrainParams myTrainParams
LookUpMap initFreightResistance() const
LookUpMap initFreightTraction() const
TrainParams initFreightParams() const
MSCFModel_Rail(const MSVehicleType *vtype, std::string trainType)
Constructor.
virtual int getModelID() const
Returns the model&#39;s ID; the XML-Tag number is used.
LookUpMap initICE1Resistance() const
double getInterpolatedValueFromLookUpMap(double speed, const LookUpMap *lookUpMap) const
LookUpMap initRB425Traction() const
LookUpMap initNGT400Traction() const
LookUpMap initRB425Resistance() const