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