Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Select Git revision
  • 877f3a85dff456d2a750021caf32304513f9bb7c
  • stable default
  • feat-fchv-bus
  • fix-h2-ice-bus
  • powertrains-multiple-axles
  • amdm3/develop
  • issue-1039
  • amdm3/main
  • test/nuget_publish
  • IEPC-experiments
  • amdm2/main
  • amdm2/develop
  • aptngearbox-not-auto
  • playground
  • official/main
  • official/develop
  • issue-templates
  • pdf-reports
  • HEV-timeruns-dev
  • timerun-empower-hybrids
  • timerun-pwheel-hybrids
  • Release/v5.0.3
  • Release/v5.0.1
  • Release/5.0.0-RC
  • Nuget/v0.11.4-DEV
  • Release/v0.11.4-DEV
  • Release/4.3.4-DEV
  • Release/4.3.3
  • Release/4.3.2-RC
  • Release/v4.3.0-DEV
  • Release/4.2.7
  • XMLConverterTool/4.2.6.0
  • Release/4.2.6-RC
  • Release/v4.2.5
  • Release/v4.2.3
  • Release/v4.2.2.3539-RC
  • Release/v4.2.1.3469
  • Release/v0.11.2.3456-DEV
  • Release/v4.2.0.3448-RC
  • Release/v4.1.3.3415
  • Release/v4.1.1.3413
41 results

MinimalPowertrain.cs

Blame
  • Forked from VECTO / VECTO Sim
    11155 commits behind the upstream repository.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    MinimalPowertrain.cs 11.11 KiB
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using TUGraz.VectoCore.Configuration;
    using TUGraz.VectoCore.FileIO.Reader;
    using TUGraz.VectoCore.FileIO.Reader.Impl;
    using TUGraz.VectoCore.Models.Connector.Ports;
    using TUGraz.VectoCore.Models.Connector.Ports.Impl;
    using TUGraz.VectoCore.Models.Declaration;
    using TUGraz.VectoCore.Models.Simulation.Data;
    using TUGraz.VectoCore.Models.Simulation.Impl;
    using TUGraz.VectoCore.Models.SimulationComponent.Data;
    using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
    using TUGraz.VectoCore.Models.SimulationComponent.Impl;
    using TUGraz.VectoCore.Tests.Utils;
    using TUGraz.VectoCore.Utils;
    using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels;
    
    namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
    {
    	[TestClass]
    	public class MinimalPowertrain
    	{
    		public const string CycleFile = @"TestData\Integration\MinimalPowerTrain\1-Gear-Test-dist.vdri";
    		public const string CycleFileStop = @"TestData\Integration\MinimalPowerTrain\1-Gear-StopTest-dist.vdri";
    		public const string EngineFile = @"TestData\Integration\MinimalPowerTrain\24t Coach.veng";
    		public const string GearboxFile = @"TestData\Integration\MinimalPowerTrain\24t Coach-1Gear.vgbx";
    		public const string GbxLossMap = @"TestData\Integration\MinimalPowerTrain\NoLossGbxMap.vtlm";
    
    
    		public const string AccelerationFile = @"TestData\Components\Coach.vacc";
    		public const string AccelerationFile2 = @"TestData\Components\Truck.vacc";
    
    		public const double Tolerance = 0.001;
    
    
    		[TestMethod]
    		public void TestWheelsAndEngineInitialize()
    		{
    			var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(EngineFile);
    
    			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
    
    			var axleGearData = CreateAxleGearData();
    
    			var driverData = CreateDriverData(AccelerationFile);
    
    			var modalWriter = new ModalDataWriter("Coach_MinimalPowertrainOverload.vmod"); //new TestModalDataWriter();
    			var sumWriter = new TestSumWriter();
    			var vehicleContainer = new VehicleContainer(modalWriter, sumWriter);
    
    			var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy());
    			dynamic tmp = Port.AddComponent(driver, new Vehicle(vehicleContainer, vehicleData));
    			tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
    			tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData));
    
    			var engine = new CombustionEngine(vehicleContainer, engineData);
    			var clutch = new Clutch(vehicleContainer, engineData, engine.IdleController);
    			tmp = Port.AddComponent(tmp, clutch);
    			Port.AddComponent(tmp, engine);
    			engine.IdleController.RequestPort = clutch.IdleControlPort;
    
    			var gbx = new MockGearbox(vehicleContainer);
    
    			var driverPort = driver.OutPort();
    
    			gbx.Gear = 1;
    
    			var response = driverPort.Initialize(18.KMPHtoMeterPerSecond(), VectoMath.InclinationToAngle(2.842372037 / 100));
    
    
    			var absTime = 0.SI<Second>();
    
    			Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
    
    //			time [s] , dist [m] , v_act [km/h] , v_targ [km/h] , acc [m/s²] , grad [%] , n [1/min] , Tq_eng [Nm] , Tq_clutch [Nm] , Tq_full [Nm] , Tq_drag [Nm] , Pe_eng [kW] , Pe_full [kW] , Pe_drag [kW] , Pe_clutch [kW] , Pa Eng [kW] , Paux [kW] , Gear [-] , Ploss GB [kW] , Ploss Diff [kW] , Ploss Retarder [kW] , Pa GB [kW] , Pa Veh [kW] , Proll [kW] , Pair [kW] , Pgrad [kW] , Pwheel [kW] , Pbrake [kW] , FC-Map [g/h] , FC-AUXc [g/h] , FC-WHTCc [g/h]
    //			1.5      , 5        , 18           , 18            , 0          , 2.842372 , 964.1117  , 323.7562    , 323.7562       , 2208.664     , -158.0261    , 32.68693    , 222.9902     , -15.95456    , 32.68693       , 0           , 0         , 1        , 0             , 0               , 0                   , 0          , 0           , 5.965827   , 0.2423075 , 26.47879   , 32.68693    , 0           , 7574.113     , -             , -
    
    			AssertHelper.AreRelativeEqual(964.1117.RPMtoRad().Value(), vehicleContainer.Engine.EngineSpeed.Value());
    			Assert.AreEqual(2208.664, engine.PreviousState.StationaryFullLoadTorque.Value(), Tolerance);
    			Assert.AreEqual(-158.0261, engine.PreviousState.FullDragTorque.Value(), Tolerance);
    
    			Assert.AreEqual(323.7562, engine.PreviousState.EngineTorque.Value(), Tolerance);
    		}
    
    
    		[TestMethod]
    		public void TestWheelsAndEngine()
    		{
    			var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(EngineFile);
    			var cycleData = DrivingCycleDataReader.ReadFromFileDistanceBased(CycleFile);
    
    			var axleGearData = CreateAxleGearData();
    
    			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
    
    			var driverData = CreateDriverData(AccelerationFile);
    
    			var modalWriter = new ModalDataWriter("Coach_MinimalPowertrain.vmod"); //new TestModalDataWriter();
    			var sumWriter = new TestSumWriter();
    			var vehicleContainer = new VehicleContainer(modalWriter, sumWriter);
    
    			var cycle = new DistanceBasedDrivingCycle(vehicleContainer, cycleData);
    
    			dynamic tmp = Port.AddComponent(cycle, new Driver(vehicleContainer, driverData, new DefaultDriverStrategy()));
    			tmp = Port.AddComponent(tmp, new Vehicle(vehicleContainer, vehicleData));
    			tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
    			tmp = Port.AddComponent(tmp, new Brakes(vehicleContainer));
    			tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData));
    			var engine = new CombustionEngine(vehicleContainer, engineData);
    			var clutch = new Clutch(vehicleContainer, engineData, engine.IdleController);
    			tmp = Port.AddComponent(tmp, clutch);
    			Port.AddComponent(tmp, engine);
    			engine.IdleController.RequestPort = clutch.IdleControlPort;
    
    			var gbx = new MockGearbox(vehicleContainer);
    
    			var cyclePort = cycle.OutPort();
    
    			cyclePort.Initialize();
    
    			gbx.Gear = 0;
    
    			var absTime = 0.SI<Second>();
    			var ds = Constants.SimulationSettings.DriveOffDistance;
    			var response = cyclePort.Request(absTime, ds);
    			Assert.IsInstanceOfType(response, typeof(ResponseSuccess));
    			vehicleContainer.CommitSimulationStep(absTime, response.SimulationInterval);
    			absTime += response.SimulationInterval;
    
    			gbx.Gear = 1;
    			var cnt = 0;
    			while (!(response is ResponseCycleFinished) && vehicleContainer.Distance < 17000) {
    				response = cyclePort.Request(absTime, ds);
    				response.Switch().
    					Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance).
    					Case<ResponseCycleFinished>(r => {}).
    					Case<ResponseSuccess>(r => {
    						vehicleContainer.CommitSimulationStep(absTime, r.SimulationInterval);
    						absTime += r.SimulationInterval;
    
    						ds = vehicleContainer.VehicleSpeed.IsEqual(0)
    							? Constants.SimulationSettings.DriveOffDistance
    							: (Constants.SimulationSettings.TargetTimeInterval * vehicleContainer.VehicleSpeed).Cast<Meter>();
    
    						if (cnt++ % 100 == 0) {
    							modalWriter.Finish();
    						}
    					}).
    					Default(r => Assert.Fail("Unexpected Response: {0}", r));
    			}
    
    			Assert.IsInstanceOfType(response, typeof(ResponseCycleFinished));
    
    			modalWriter.Finish();
    		}
    
    		[TestMethod]
    		public void TestWheelsAndEngineLookahead()
    		{
    			var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(EngineFile);
    			var cycleData = DrivingCycleDataReader.ReadFromFileDistanceBased(CycleFileStop);
    
    			var axleGearData = CreateAxleGearData();
    
    			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
    
    			var driverData = CreateDriverData(AccelerationFile2);
    
    			var modalWriter = new ModalDataWriter("Coach_MinimalPowertrainOverload.vmod",
    				SimulatorFactory.FactoryMode.EngineeringMode);
    			var sumWriter = new TestSumWriter();
    			var vehicleContainer = new VehicleContainer(modalWriter, sumWriter);
    
    			var cycle = new DistanceBasedDrivingCycle(vehicleContainer, cycleData);
    
    			dynamic tmp = Port.AddComponent(cycle, new Driver(vehicleContainer, driverData, new DefaultDriverStrategy()));
    			tmp = Port.AddComponent(tmp, new Vehicle(vehicleContainer, vehicleData));
    			tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius));
    			tmp = Port.AddComponent(tmp, new Brakes(vehicleContainer));
    			tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData));
    			var engine = new CombustionEngine(vehicleContainer, engineData);
    			var clutch = new Clutch(vehicleContainer, engineData, engine.IdleController);
    			tmp = Port.AddComponent(tmp, clutch);
    			Port.AddComponent(tmp, engine);
    			engine.IdleController.RequestPort = clutch.IdleControlPort;
    
    			var gbx = new MockGearbox(vehicleContainer);
    
    			var cyclePort = cycle.OutPort();
    
    			cyclePort.Initialize();
    
    			gbx.Gear = 0;
    
    			var absTime = 0.SI<Second>();
    
    			gbx.Gear = 1;
    			var ds = Constants.SimulationSettings.DriveOffDistance;
    			while (vehicleContainer.Distance < 100) {
    				var response = cyclePort.Request(absTime, ds);
    				response.Switch().
    					Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance).
    					Case<ResponseSuccess>(r => {
    						vehicleContainer.CommitSimulationStep(absTime, r.SimulationInterval);
    						absTime += r.SimulationInterval;
    
    						ds = vehicleContainer.VehicleSpeed.IsEqual(0)
    							? Constants.SimulationSettings.DriveOffDistance
    							: (Constants.SimulationSettings.TargetTimeInterval * vehicleContainer.VehicleSpeed).Cast<Meter>();
    
    						modalWriter.Finish();
    					});
    			}
    
    			modalWriter.Finish();
    		}
    
    		private static GearData CreateAxleGearData()
    		{
    			return new GearData {
    				Ratio = 3.0 * 3.5,
    				LossMap = TransmissionLossMap.ReadFromFile(GbxLossMap, 3.0 * 3.5)
    			};
    		}
    
    
    		private static VehicleData CreateVehicleData(Kilogram loading)
    		{
    			var axles = new List<Axle> {
    				new Axle {
    					AxleWeightShare = 0.4375,
    					Inertia = 21.66667.SI<KilogramSquareMeter>(),
    					RollResistanceCoefficient = 0.0055,
    					TwinTyres = false,
    					TyreTestLoad = 62538.75.SI<Newton>()
    				},
    				new Axle {
    					AxleWeightShare = 0.375,
    					Inertia = 10.83333.SI<KilogramSquareMeter>(),
    					RollResistanceCoefficient = 0.0065,
    					TwinTyres = true,
    					TyreTestLoad = 52532.55.SI<Newton>()
    				},
    				new Axle {
    					AxleWeightShare = 0.1875,
    					Inertia = 21.66667.SI<KilogramSquareMeter>(),
    					RollResistanceCoefficient = 0.0055,
    					TwinTyres = false,
    					TyreTestLoad = 62538.75.SI<Newton>()
    				}
    			};
    			return new VehicleData {
    				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
    				CrossSectionArea = 3.2634.SI<SquareMeter>(),
    				CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
    				DragCoefficient = 1,
    				CurbWeight = 15700.SI<Kilogram>(),
    				CurbWeigthExtra = 0.SI<Kilogram>(),
    				Loading = loading,
    				DynamicTyreRadius = 0.52.SI<Meter>(),
    				Retarder = new RetarderData { Type = RetarderData.RetarderType.None },
    				AxleData = axles,
    				SavedInDeclarationMode = false,
    			};
    		}
    
    		private static DriverData CreateDriverData(string accelerationFile)
    		{
    			return new DriverData {
    				AccelerationCurve = AccelerationCurveData.ReadFromFile(accelerationFile),
    				LookAheadCoasting = new DriverData.LACData {
    					Enabled = false,
    					Deceleration = -0.5.SI<MeterPerSquareSecond>()
    				},
    				OverSpeedEcoRoll = new DriverData.OverSpeedEcoRollData {
    					Mode = DriverData.DriverMode.Off
    				},
    				StartStop = new VectoRunData.StartStopData {
    					Enabled = false,
    				}
    			};
    		}
    	}
    }