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 % 674 664
Test Date: 2025-11-13 15:38:19 Functions: 100.0 % 31 31

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

Generated by: LCOV version 2.0-1