LCOV - code coverage report
Current view: top level - src/microsim/cfmodels - MSCFModel_Rail.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 98.5 % 679 669
Test Date: 2026-08-12 15:17:01 Functions: 100.0 % 32 32

            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              : };
        

Generated by: LCOV version 2.0-1