diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs index df2648c4135fea1807873a5af0515989582162b9..d888ef53d37fa703fe9fa692f89ae017568d0632 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs @@ -96,7 +96,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public CombustionEngineData Copy() { - return new CombustionEngineData { + return new CombustionEngineData { + Manufacturer = Manufacturer, + ModelName = ModelName, Displacement = Displacement, IdleSpeed = IdleSpeed, Inertia = Inertia, diff --git a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs index 8a49735932b2f67c3b9ac6c74c076c0accd9ab69..84d05e0c73a0095ada33648770e6f3008e7acd85 100644 --- a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs +++ b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs @@ -29,131 +29,176 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using Microsoft.VisualStudio.TestTools.UnitTesting; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.Declaration; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.Simulation.DataBus; -using TUGraz.VectoCore.Models.Simulation.Impl; -using TUGraz.VectoCore.OutputData; -using TUGraz.VectoCore.OutputData.FileIO; -using TUGraz.VectoCore.Tests.Models.SimulationComponent; -using TUGraz.VectoCore.Tests.Utils; -using TUGraz.VectoCore.Utils; - -namespace TUGraz.VectoCore.Tests.Reports -{ - [TestClass] - public class SumWriterTest - { - [TestMethod] - public void TestSumCalcFixedTime() - { - var writer = new FileOutputWriter("testsumcalc_fixed"); - var sumWriter = new SummaryDataContainer(writer); - - var modData = new ModalDataContainer("testsumcalc_fixed", FuelType.DieselCI, writer); - - modData.AddAuxiliary("FAN"); - - for (var i = 0; i < 499; i++) { - modData[ModalResultField.simulationInterval] = 1.SI<Second>(); - modData[ModalResultField.n_eng_avg] = 600.RPMtoRad(); - modData[ModalResultField.v_act] = 20.KMPHtoMeterPerSecond(); - modData[ModalResultField.drivingBehavior] = DrivingBehavior.Driving; - modData[ModalResultField.time] = i.SI<Second>(); - modData[ModalResultField.dist] = i.SI<Meter>(); - modData["FAN"] = 3000.SI<Watt>(); - modData[ModalResultField.P_air] = 3000.SI<Watt>(); - modData[ModalResultField.P_roll] = 3000.SI<Watt>(); - modData[ModalResultField.P_slope] = 3000.SI<Watt>(); - modData[ModalResultField.P_aux] = 3000.SI<Watt>(); - modData[ModalResultField.P_brake_loss] = 3000.SI<Watt>(); - - modData[ModalResultField.FCMap] = 1e-4.SI<KilogramPerSecond>(); - - modData[ModalResultField.altitude] = 0.SI<Meter>(); - modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); - modData[ModalResultField.P_eng_out] = (i % 2 == 0 ? 1 : -1) * 3000.SI<Watt>(); - - modData[ModalResultField.P_eng_fcmap] = 0.SI<Watt>(); - - modData.CommitSimulationStep(); - } - - sumWriter.Write(modData, 0, 0, new MockRunData()); - - modData.Finish(VectoRun.Status.Success); - sumWriter.Finish(); - - var sumData = VectoCSVFile.Read("testsumcalc_fixed.vsum", false, true); - - // 3kW * 500s => to kWh - Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_air [kWh]"), 1e-3); - Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_aux_FAN [kWh]"), 1e-3); - Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_roll [kWh]"), 1e-3); - Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_grad [kWh]"), 1e-3); - Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_aux_sum [kWh]"), 1e-3); - Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_brake [kWh]"), 1e-3); - - // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 500 => to g/h - Assert.AreEqual((500.0 * 1e-4) * 1000 * 3600 / 500.0, sumData.Rows[0].ParseDouble("FC-Map [g/h]"), 1e-3); - // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 499m => to g/km - Assert.AreEqual((500.0 * 1e-4) * 1000 * 1000 / 499.0, sumData.Rows[0].ParseDouble("FC-Map [g/km]"), 1e-3); - } - - [TestMethod] - public void TestSumCalcVariableTime() - { - var writer = new FileOutputWriter("testsumcalc_var"); - var sumWriter = new SummaryDataContainer(writer); - - var modData = new ModalDataContainer("testsumcalc_var", FuelType.DieselCI, writer); - modData.AddAuxiliary("FAN"); - - var timeSteps = new[] - { 0.5.SI<Second>(), 0.3.SI<Second>(), 1.2.SI<Second>(), 12.SI<Second>(), 0.1.SI<Second>() }; - var powerDemand = new[] - { 1000.SI<Watt>(), 1500.SI<Watt>(), 2000.SI<Watt>(), 2500.SI<Watt>(), 3000.SI<Watt>() }; - - for (var i = 0; i < 500; i++) { - modData[ModalResultField.simulationInterval] = timeSteps[i % timeSteps.Length]; - modData[ModalResultField.time] = i.SI<Second>(); - modData[ModalResultField.dist] = i.SI<Meter>(); - modData[ModalResultField.n_eng_avg] = 600.RPMtoRad(); - modData[ModalResultField.v_act] = 20.KMPHtoMeterPerSecond(); - modData[ModalResultField.drivingBehavior] = DrivingBehavior.Driving; - modData["FAN"] = powerDemand[i % powerDemand.Length]; - modData[ModalResultField.P_air] = powerDemand[i % powerDemand.Length]; - modData[ModalResultField.P_roll] = powerDemand[i % powerDemand.Length]; - modData[ModalResultField.P_slope] = powerDemand[i % powerDemand.Length]; - modData[ModalResultField.P_aux] = powerDemand[i % powerDemand.Length]; - modData[ModalResultField.P_brake_loss] = powerDemand[i % powerDemand.Length]; - - modData[ModalResultField.altitude] = 0.SI<Meter>(); - modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); - modData[ModalResultField.P_eng_out] = (i % 2 == 0 ? 1 : -1) * powerDemand[i % powerDemand.Length]; - - modData[ModalResultField.P_eng_fcmap] = 0.SI<Watt>(); - - modData.CommitSimulationStep(); - } - - sumWriter.Write(modData, 0, 0, new MockRunData()); - - modData.Finish(VectoRun.Status.Success); - sumWriter.Finish(); - - var sumData = VectoCSVFile.Read("testsumcalc_var.vsum", false, true); - - // sum(dt * p) => to kWh - Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_air [kWh]"), 1e-3); - Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_aux_FAN [kWh]"), 1e-3); - Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_roll [kWh]"), 1e-3); - Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_grad [kWh]"), 1e-3); - Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_aux_sum [kWh]"), 1e-3); - Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_brake [kWh]"), 1e-3); - } - } +using System.IO; +using System.Xml; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.DataBus; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.OutputData; +using TUGraz.VectoCore.OutputData.FileIO; +using TUGraz.VectoCore.OutputData.XML; +using TUGraz.VectoCore.Tests.Models.SimulationComponent; +using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Tests.Reports +{ + [TestClass] + public class SumWriterTest + { + [TestMethod] + public void TestSumCalcFixedTime() + { + var writer = new FileOutputWriter("testsumcalc_fixed"); + var sumWriter = new SummaryDataContainer(writer); + + var modData = new ModalDataContainer("testsumcalc_fixed", FuelType.DieselCI, writer); + + modData.AddAuxiliary("FAN"); + + for (var i = 0; i < 499; i++) { + modData[ModalResultField.simulationInterval] = 1.SI<Second>(); + modData[ModalResultField.n_eng_avg] = 600.RPMtoRad(); + modData[ModalResultField.v_act] = 20.KMPHtoMeterPerSecond(); + modData[ModalResultField.drivingBehavior] = DrivingBehavior.Driving; + modData[ModalResultField.time] = i.SI<Second>(); + modData[ModalResultField.dist] = i.SI<Meter>(); + modData["FAN"] = 3000.SI<Watt>(); + modData[ModalResultField.P_air] = 3000.SI<Watt>(); + modData[ModalResultField.P_roll] = 3000.SI<Watt>(); + modData[ModalResultField.P_slope] = 3000.SI<Watt>(); + modData[ModalResultField.P_aux] = 3000.SI<Watt>(); + modData[ModalResultField.P_brake_loss] = 3000.SI<Watt>(); + + modData[ModalResultField.FCMap] = 1e-4.SI<KilogramPerSecond>(); + + modData[ModalResultField.altitude] = 0.SI<Meter>(); + modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); + modData[ModalResultField.P_eng_out] = (i % 2 == 0 ? 1 : -1) * 3000.SI<Watt>(); + + modData[ModalResultField.P_eng_fcmap] = 0.SI<Watt>(); + + modData.CommitSimulationStep(); + } + + sumWriter.Write(modData, 0, 0, new MockRunData()); + + modData.Finish(VectoRun.Status.Success); + sumWriter.Finish(); + + var sumData = VectoCSVFile.Read("testsumcalc_fixed.vsum", false, true); + + // 3kW * 500s => to kWh + Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_air [kWh]"), 1e-3); + Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_aux_FAN [kWh]"), 1e-3); + Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_roll [kWh]"), 1e-3); + Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_grad [kWh]"), 1e-3); + Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_aux_sum [kWh]"), 1e-3); + Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_brake [kWh]"), 1e-3); + + // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 500 => to g/h + Assert.AreEqual((500.0 * 1e-4) * 1000 * 3600 / 500.0, sumData.Rows[0].ParseDouble("FC-Map [g/h]"), 1e-3); + // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 499m => to g/km + Assert.AreEqual((500.0 * 1e-4) * 1000 * 1000 / 499.0, sumData.Rows[0].ParseDouble("FC-Map [g/km]"), 1e-3); + } + + [TestMethod] + public void TestSumCalcVariableTime() + { + var writer = new FileOutputWriter("testsumcalc_var"); + var sumWriter = new SummaryDataContainer(writer); + + var modData = new ModalDataContainer("testsumcalc_var", FuelType.DieselCI, writer); + modData.AddAuxiliary("FAN"); + + var timeSteps = new[] + { 0.5.SI<Second>(), 0.3.SI<Second>(), 1.2.SI<Second>(), 12.SI<Second>(), 0.1.SI<Second>() }; + var powerDemand = new[] + { 1000.SI<Watt>(), 1500.SI<Watt>(), 2000.SI<Watt>(), 2500.SI<Watt>(), 3000.SI<Watt>() }; + + for (var i = 0; i < 500; i++) { + modData[ModalResultField.simulationInterval] = timeSteps[i % timeSteps.Length]; + modData[ModalResultField.time] = i.SI<Second>(); + modData[ModalResultField.dist] = i.SI<Meter>(); + modData[ModalResultField.n_eng_avg] = 600.RPMtoRad(); + modData[ModalResultField.v_act] = 20.KMPHtoMeterPerSecond(); + modData[ModalResultField.drivingBehavior] = DrivingBehavior.Driving; + modData["FAN"] = powerDemand[i % powerDemand.Length]; + modData[ModalResultField.P_air] = powerDemand[i % powerDemand.Length]; + modData[ModalResultField.P_roll] = powerDemand[i % powerDemand.Length]; + modData[ModalResultField.P_slope] = powerDemand[i % powerDemand.Length]; + modData[ModalResultField.P_aux] = powerDemand[i % powerDemand.Length]; + modData[ModalResultField.P_brake_loss] = powerDemand[i % powerDemand.Length]; + + modData[ModalResultField.altitude] = 0.SI<Meter>(); + modData[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); + modData[ModalResultField.P_eng_out] = (i % 2 == 0 ? 1 : -1) * powerDemand[i % powerDemand.Length]; + + modData[ModalResultField.P_eng_fcmap] = 0.SI<Watt>(); + + modData.CommitSimulationStep(); + } + + sumWriter.Write(modData, 0, 0, new MockRunData()); + + modData.Finish(VectoRun.Status.Success); + sumWriter.Finish(); + + var sumData = VectoCSVFile.Read("testsumcalc_var.vsum", false, true); + + // sum(dt * p) => to kWh + Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_air [kWh]"), 1e-3); + Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_aux_FAN [kWh]"), 1e-3); + Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_roll [kWh]"), 1e-3); + Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_grad [kWh]"), 1e-3); + Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_aux_sum [kWh]"), 1e-3); + Assert.AreEqual(0.934722222, sumData.Rows[0].ParseDouble("E_brake [kWh]"), 1e-3); + } + + [TestMethod] + public void TestSumDataMetaInformation() + { + var jobfile = @"Testdata\XML\XMLReaderDeclaration\vecto_vehicle-sample.xml"; + var dataProvider = new XMLDeclarationInputDataProvider(XmlTextReader.Create(jobfile), true); + var writer = new FileOutputWriter(jobfile); + var xmlReport = new XMLDeclarationReport(writer); + var sumData = new SummaryDataContainer(writer); + var jobContainer = new JobContainer(sumData); + + if (File.Exists(writer.SumFileName)) { + File.Delete(writer.SumFileName); + } + + var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, dataProvider, writer, xmlReport) { + WriteModalResults = false, + Validate = false, + }; + jobContainer.AddRuns(runsFactory); + jobContainer.Execute(); + jobContainer.WaitFinished(); + + var sumRow = sumData.Table.Rows[1]; + Assert.AreEqual(dataProvider.VehicleInputData.Manufacturer, sumRow[SummaryDataContainer.VEHICLE_MANUFACTURER]); + Assert.AreEqual(dataProvider.VehicleInputData.Model, sumRow[SummaryDataContainer.VEHICLE_MODEL]); + Assert.AreEqual(dataProvider.VehicleInputData.VIN, sumRow[SummaryDataContainer.VIN_NUMBER]); + Assert.AreEqual(dataProvider.EngineInputData.Manufacturer, sumRow[SummaryDataContainer.ENGINE_MANUFACTURER]); + Assert.AreEqual(dataProvider.EngineInputData.Model, sumRow[SummaryDataContainer.ENGINE_MODEL]); + Assert.AreEqual(dataProvider.EngineInputData.FuelType.GetLabel(), sumRow[SummaryDataContainer.ENGINE_FUEL_TYPE]); + Assert.AreEqual((dataProvider.EngineInputData.RatedPowerDeclared.ConvertTo().Kilo.Watt.Value()), + ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_POWER]).Value()); + Assert.AreEqual(dataProvider.EngineInputData.RatedSpeedDeclared.AsRPM, + ((SI)sumRow[SummaryDataContainer.ENGINE_RATED_SPEED]).Value()); + Assert.AreEqual(dataProvider.EngineInputData.Displacement.ConvertTo().Cubic.Centi.Meter.Value(), + ((SI)sumRow[SummaryDataContainer.ENGINE_DISPLACEMENT]).Value()); + Assert.AreEqual(dataProvider.GearboxInputData.Manufacturer, sumRow[SummaryDataContainer.GEARBOX_MANUFACTURER]); + Assert.AreEqual(dataProvider.GearboxInputData.Model, sumRow[SummaryDataContainer.GEARBOX_MODEL]); + Assert.AreEqual(dataProvider.AxleGearInputData.Manufacturer, sumRow[SummaryDataContainer.AXLE_MANUFACTURER]); + Assert.AreEqual(dataProvider.AxleGearInputData.Model, sumRow[SummaryDataContainer.AXLE_MODEL]); + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 9d5741aa3cfee88d1b0fa57d535c768f5c0d8c17..137e8472b04e4d474869d9b8c5b3f56e3a5f975b 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -2543,9 +2543,14 @@ <Folder Include="Integration\FullPowertrain\" /> </ItemGroup> <ItemGroup> + <Content Include="TestData\XML\XMLReaderDeclaration\vecto_engine-sample.xml" /> + <Content Include="TestData\XML\XMLReaderDeclaration\vecto_gearbox-sample.xml" /> <Content Include="TestData\XML\XMLReaderDeclaration\vecto_vehicle-sample.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="TestData\XML\XMLReaderDeclaration\vecto_vehicle-sample_certificationOptions.xml"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\XML\XMLReaderDeclaration\vecto_vehicle-sample_FULL.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>