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
  • 7cb93b24dcc45f4dda13e841f07395f618dbb8e9
  • 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

FullCycleDeclarationTest.cs

Blame
  • Forked from VECTO / VECTO Sim
    9197 commits behind the upstream repository.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    FullCycleDeclarationTest.cs 12.55 KiB
    /*
    * This file is part of VECTO.
    *
    * Copyright © 2012-2016 European Union
    *
    * Developed by Graz University of Technology,
    *              Institute of Internal Combustion Engines and Thermodynamics,
    *              Institute of Technical Informatics
    *
    * VECTO is licensed under the EUPL, Version 1.1 or - as soon they will be approved
    * by the European Commission - subsequent versions of the EUPL (the "Licence");
    * You may not use VECTO except in compliance with the Licence.
    * You may obtain a copy of the Licence at:
    *
    * https://joinup.ec.europa.eu/community/eupl/og_page/eupl
    *
    * Unless required by applicable law or agreed to in writing, VECTO
    * distributed under the Licence is distributed on an "AS IS" basis,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the Licence for the specific language governing permissions and
    * limitations under the Licence.
    *
    * Authors:
    *   Stefan Hausberger, hausberger@ivt.tugraz.at, IVT, Graz University of Technology
    *   Christian Kreiner, christian.kreiner@tugraz.at, ITI, Graz University of Technology
    *   Michael Krisper, michael.krisper@tugraz.at, ITI, Graz University of Technology
    *   Raphael Luz, luz@ivt.tugraz.at, IVT, Graz University of Technology
    *   Markus Quaritsch, markus.quaritsch@tugraz.at, IVT, Graz University of Technology
    *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
    */
    
    using System.Data;
    using System.IO;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using TUGraz.VectoCommon.Models;
    using TUGraz.VectoCommon.Utils;
    using TUGraz.VectoCore.InputData.FileIO.JSON;
    using TUGraz.VectoCore.Models.Simulation.Data;
    using TUGraz.VectoCore.Models.Simulation.Impl;
    using TUGraz.VectoCore.OutputData;
    using TUGraz.VectoCore.OutputData.FileIO;
    using TUGraz.VectoCore.Tests.Utils;
    using TUGraz.VectoCore.Utils;
    
    namespace TUGraz.VectoCore.Tests.Integration
    {
    	[TestClass]
    	public class FullCycleDeclarationTest
    	{
    		public const string LongHaulTruckDeclarationJob =
    			@"TestData\Integration\DeclarationMode\40t Truck\40t_Long_Haul_Truck.vecto";
    
    		public const string DeliveryTruckDeclarationJob =
    			@"TestData\Integration\DeclarationMode\12t Truck\12t Delivery Truck.vecto";
    
    		public const string DeliveryTruck8GearDeclarationJob =
    			@"TestData\Integration\DeclarationMode\12t Truck\12t Delivery Truck_8gear.vecto";
    
    		[TestMethod]
    		public void Truck40t_LongHaulCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("LongHaul");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_LongHaulCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod]
    		public void Truck40t_RegionalDeliveryCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("RegionalDelivery");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_RegionalDeliveryCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>(), true);
    
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod]
    		public void Truck40t_UrbanDeliveryCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("UrbanDelivery");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_UrbanDeliveryCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod]
    		public void Truck40t_MunicipalCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("MunicipalUtility");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_MunicipalCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod]
    		public void Truck40t_ConstructionCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("Construction");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_ConstructionCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod]
    		public void Truck40t_HeavyUrbanCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("HeavyUrban");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_HeavyUrbanCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			//((DistanceBasedDrivingCycle)((VehicleContainer)run.GetContainer()).Cycle).SetDriveOffDistance(26700.SI<Meter>());
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod]
    		public void Truck40t_SubUrbanCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("Suburban");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_SubUrbanCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod, TestCategory("LongRunning")]
    		public void Truck40t_InterUrbanCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("Interurban");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_InterUrbanCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    			//((DistanceBasedDrivingCycle)((VehicleContainer)run.GetContainer()).Cycle).SetDriveOffDistance(33000.SI<Meter>());
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod, TestCategory("LongRunning")]
    		public void Truck40t_CoachCycle_RefLoad()
    		{
    			var cycle = SimpleDrivingCycles.ReadDeclarationCycle("Coach");
    			var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck40t_CoachCycle_RefLoad.vmod",
    				7500.SI<Kilogram>(), 12900.SI<Kilogram>());
    
    			//((DistanceBasedDrivingCycle)((VehicleContainer)run.GetContainer()).Cycle).SetDriveOffDistance(152429.9.SI<Meter>());
    			run.Run();
    			Assert.IsTrue(run.FinishedWithoutErrors);
    		}
    
    		[TestMethod, TestCategory("LongRunning")]
    		public void Truck40t_DeclarationTest()
    		{
    			var inputData = JSONInputDataFactory.ReadJsonJob(LongHaulTruckDeclarationJob);
    			var fileWriter = new FileOutputWriter(LongHaulTruckDeclarationJob);
    			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
    				WriteModalResults = true
    			};
    			var sumData = new SummaryDataContainer(fileWriter);
    			var jobContainer = new JobContainer(sumData);
    			jobContainer.AddRuns(factory);
    
    			//var i = 2;
    			//jobContainer.Runs[i].Run.Run();
    			//Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors);
    
    			jobContainer.Execute();
    			jobContainer.WaitFinished();
    
    			Assert.IsTrue(jobContainer.Runs.All(r => r.Success), string.Concat(jobContainer.Runs.Select(r => r.ExecException)));
    		}
    
    		[TestMethod, TestCategory("LongRunning")]
    		public void Truck40t_Mod1Hz_Test()
    		{
    			var modFileName = "40t_Long_Haul_Truck_RegionalDeliveryFullLoading.vmod";
    			var modFileName1Hz = "40t_Long_Haul_Truck_RegionalDeliveryFullLoading_1Hz.vmod";
    
    			if (File.Exists(modFileName)) {
    				File.Delete(modFileName);
    			}
    
    			if (File.Exists(modFileName1Hz)) {
    				File.Delete(modFileName1Hz);
    			}
    
    			var inputData = JSONInputDataFactory.ReadJsonJob(LongHaulTruckDeclarationJob);
    			var fileWriter = new FileOutputWriter("Truck40t_Mod1Hz_Test.vecto");
    			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
    				WriteModalResults = true,
    				ModalResults1Hz = false
    			};
    			var factory1Hz = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
    				WriteModalResults = true,
    				ModalResults1Hz = true
    			};
    			var sumData = new SummaryDataContainer(fileWriter);
    			var jobContainer = new JobContainer(sumData);
    			jobContainer.AddRuns(factory);
    
    			var i = 5;
    			jobContainer.Runs[i].Run.Run();
    			Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors,
    				string.Format("{0}", jobContainer.Runs[i].ExecException));
    
    			jobContainer = new JobContainer(sumData);
    			jobContainer.AddRuns(factory1Hz);
    
    			jobContainer.Runs[i].Run.Run();
    			Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors,
    				string.Format("{0}", jobContainer.Runs[i].ExecException));
    
    			var modFile = VectoCSVFile.Read(modFileName);
    			var modFile1Hz = VectoCSVFile.Read(modFileName1Hz);
    
    			// test if line count matches the second count
    			var maxSeconds = modFile.Rows.Cast<DataRow>().Last().ParseDouble(ModalResultField.time.GetShortCaption());
    			var lineCount1Hz = modFile1Hz.Rows.Count;
    
    			AssertHelper.AreRelativeEqual(lineCount1Hz, maxSeconds,
    				string.Format("LineCount must equal max seconds. Lines={0}, MaxSeconds={1}", lineCount1Hz,
    					maxSeconds), 1);
    
    			// test max distance
    			var maxDistance = modFile.Rows.Cast<DataRow>().Last().ParseDouble(ModalResultField.dist.GetShortCaption());
    			var maxDistance1Hz = modFile1Hz.Rows.Cast<DataRow>().Last().ParseDouble(ModalResultField.dist.GetShortCaption());
    			AssertHelper.AreRelativeEqual(maxDistance, maxDistance1Hz);
    
    			// test if interval in 1Hz always is 1
    			Assert.IsTrue(
    				modFile1Hz.Rows.Cast<DataRow>()
    					.All(r => r.ParseDouble(ModalResultField.simulationInterval.GetShortCaption()).IsEqual(1)),
    				"dt must always be 1 second");
    
    			// test if absTime in 1Hz always is a whole number and consecutive
    			Assert.IsTrue(
    				modFile1Hz.Rows.Cast<DataRow>()
    					.Select((r, index) => r.ParseDouble(ModalResultField.time.GetName()).IsEqual(index + 1))
    					.All(p => p), "time must be whole numbers and consecutive");
    
    			// test sum of fuel consumption
    			var sumFuelConsumption = modFile.Rows.Cast<DataRow>().Select(r =>
    				r.ParseDoubleOrGetDefault(ModalResultField.FCWHTCc.GetShortCaption()) *
    				r.ParseDouble(ModalResultField.simulationInterval.GetShortCaption())).Sum();
    			var sumFuelConsumption1Hz =
    				modFile1Hz.Rows.Cast<DataRow>()
    					.Select(r => r.ParseDoubleOrGetDefault(ModalResultField.FCWHTCc.GetShortCaption()))
    					.Sum();
    			AssertHelper.AreRelativeEqual(sumFuelConsumption, sumFuelConsumption1Hz, "Fuel Consumption is not equal", 1e-4);
    
    			// test speed not negative
    			Assert.IsTrue(
    				modFile1Hz.Rows.Cast<DataRow>()
    					.All(r => r.ParseDouble(ModalResultField.v_act.GetShortCaption()).IsGreaterOrEqual(0)),
    				"v_act must not be negative.");
    
    			// test fuel consumption not negative
    			Assert.IsTrue(
    				modFile1Hz.Rows.Cast<DataRow>()
    					.All(r => r.ParseDouble(ModalResultField.FCWHTCc.GetShortCaption()).IsGreaterOrEqual(0)),
    				"fuel consumption must not be negative.");
    
    			// last v_act entry must be the same as original
    			var vAct = modFile.Rows.Cast<DataRow>().Last().ParseDouble((int)ModalResultField.v_act).SI<MeterPerSecond>();
    			var vAct1Hz = modFile1Hz.Rows.Cast<DataRow>().Last().ParseDouble((int)ModalResultField.v_act).SI<MeterPerSecond>();
    			AssertHelper.AreRelativeEqual(vAct, vAct1Hz, "end velocity is not equal", 1e-4);
    		}
    
    		[TestMethod, TestCategory("LongRunning")]
    		public void Truck12t_DeclarationTest()
    		{
    			var inputData = JSONInputDataFactory.ReadJsonJob(DeliveryTruckDeclarationJob);
    			var fileWriter = new FileOutputWriter(DeliveryTruckDeclarationJob);
    			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
    				WriteModalResults = true
    			};
    			var sumData = new SummaryDataContainer(fileWriter);
    			var jobContainer = new JobContainer(sumData);
    			jobContainer.AddRuns(factory);
    
    			//var i = 2;
    			//jobContainer.Runs[i].Run.Run();
    			//Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors);
    
    			//var i = 0;
    			//foreach (var runEntry in jobContainer.Runs) {
    			//	runEntry.Run.Run();
    			//	Assert.IsTrue(runEntry.Run.FinishedWithoutErrors, "run {0} failed", i);
    			//	i++;
    			//}
    
    			jobContainer.Execute();
    			jobContainer.WaitFinished();
    			Assert.IsTrue(jobContainer.Runs.All(r => r.Success),
    				string.Format("folowing runs failed: {0}\n{1}",
    					string.Concat(jobContainer.Runs.Where(r => !r.Success).Select(r => r.Run.RunName + " - " + r.Run.CycleName)),
    					string.Concat(jobContainer.Runs.Select(r => r.ExecException))));
    		}
    
    		[TestMethod, TestCategory("LongRunning")]
    		public void Truck12t8Gear_DeclarationTest()
    		{
    			var inputData = JSONInputDataFactory.ReadJsonJob(DeliveryTruck8GearDeclarationJob);
    			var fileWriter = new FileOutputWriter(DeliveryTruck8GearDeclarationJob);
    			var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
    				WriteModalResults = true
    			};
    			var sumData = new SummaryDataContainer(fileWriter);
    			var jobContainer = new JobContainer(sumData);
    			jobContainer.AddRuns(factory);
    
    			//var runs = jobContainer.Runs;
    
    			//runs[8].Run.Run();
    
    			jobContainer.Execute();
    			jobContainer.WaitFinished();
    
    			Assert.IsTrue(jobContainer.Runs.All(r => r.Success), string.Concat(jobContainer.Runs.Select(r => r.ExecException)));
    		}
    	}
    }