diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 6a98825c3c5da7cc917600c26f7272160c1ea9f7..a69e2e0b5051580a96c96a7fb4980b2766a9d7f7 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -1395,24 +1395,22 @@ namespace TUGraz.VectoCore.Models.Declaration public static IWeightedResult CalculateWeightedSummary(IList<IResultEntry> entries) { // ToDo MQ 2022-12-12: add correct calculation method! - var cdResult = entries.First(); - var csResult = entries.First(); - return new WeightedResult(cdResult) { - AverageSpeed = cdResult.AverageSpeed, - FuelConsumption = cdResult.FuelData.Select(x => Tuple.Create(x, - (cdResult.FuelConsumptionFinal(x.FuelType).TotalFuelConsumptionCorrected + - csResult.FuelConsumptionFinal(x.FuelType).TotalFuelConsumptionCorrected) / 2.0)) + var first = entries.First(); + return new WeightedResult(first) { + AverageSpeed = first.AverageSpeed, + FuelConsumption = first.FuelData.Select(x => Tuple.Create(x, + first.FuelConsumptionFinal(x.FuelType).TotalFuelConsumptionCorrected)) .ToDictionary(x => x.Item1, x => x.Item2), - ElectricEnergyConsumption = (cdResult.ElectricEnergyConsumption + csResult.ElectricEnergyConsumption) / 2.0, - CO2Total = (cdResult.CO2Total + csResult.CO2Total) / 2.0, - ActualChargeDepletingRange = cdResult.Distance, - EquivalentAllElectricRange = cdResult.Distance, - ZeroCO2EmissionsRange = cdResult.Distance, + ElectricEnergyConsumption = first.ElectricEnergyConsumption, + CO2Total = first.CO2Total, + ActualChargeDepletingRange = first.Distance, + EquivalentAllElectricRange = first.Distance, + ZeroCO2EmissionsRange = first.Distance, UtilityFactor = 1, - AuxHeaterFuel = cdResult.AuxHeaterFuel, - ZEV_CO2 = cdResult.ZEV_CO2, - ZEV_FuelConsumption_AuxHtr = cdResult.ZEV_FuelConsumption_AuxHtr + AuxHeaterFuel = first.AuxHeaterFuel, + ZEV_CO2 = first.ZEV_CO2, + ZEV_FuelConsumption_AuxHtr = first.ZEV_FuelConsumption_AuxHtr }; } diff --git a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs index 495d3026f41c0018b7a9d0a9329f4ea03d5d12bc..903283729abc49045ea93d798c8dabc279599039 100644 --- a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs +++ b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs @@ -44,6 +44,7 @@ public class TestXMLResultsWriting _reportResultsFactory = _kernel.Get<IResultsWriterFactory>(); } + [ TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.ConventionalVehicle, false, true, typeof(CIFResultsWriter.ExemptedResultsWriter)), TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.ConventionalVehicle, false, false, typeof(CIFResultsWriter.ConventionalLorry)), @@ -51,7 +52,6 @@ public class TestXMLResultsWriting TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.ParallelHybridVehicle, false, false, typeof(CIFResultsWriter.HEVNonOVCLorry)), TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.SerialHybridVehicle, true, false, typeof(CIFResultsWriter.HEVOVCLorry)), TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.BatteryElectricVehicle, true, false, typeof(CIFResultsWriter.PEVLorry)), - //TestCase(VehicleCategory.RigidTruck, VectoSimulationJobType.BatteryElectricVehicle, false, false, typeof(CIFResultsWriter.PEVLorry)), // for PEV, OVC is always true! ] public void TestReportResultInstance(VehicleCategory vehicleCategory, VectoSimulationJobType jobType, bool ovc, bool exempted, Type expectedResultWriterType) @@ -62,11 +62,16 @@ public class TestXMLResultsWriting } + [ TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, TestName = "ReportResult_WritingResults: Lorry Conv SUCCESS"), + TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, FuelType.NGCI, FuelType.DieselCI, TestName = "ReportResult_WritingResults: Lorry Conv DualFuel SUCCESS"), + TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, FuelType.NGPI, TestName = "ReportResult_WritingResults: Lorry Conv LNG SUCCESS"), TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, false, TestName = "ReportResult_WritingResults: Lorry Conv ERROR"), TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, true, TestName = "ReportResult_WritingResults: Lorry HEV OVC SUCCESS"), + TestCase(VectoSimulationJobType.SerialHybridVehicle, true, false, true, FuelType.NGCI, FuelType.DieselCI, TestName = "ReportResult_WritingResults: Lorry HEV OVC DualFuel SUCCESS"), + TestCase(VectoSimulationJobType.IEPC_S, true, false, true, FuelType.NGPI, TestName = "ReportResult_WritingResults: Lorry HEV OVC LNG SUCCESS"), TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, false, TestName = "ReportResult_WritingResults: Lorry HEV OVC ERROR"), TestCase(VectoSimulationJobType.ParallelHybridVehicle, false, false, true, TestName = "ReportResult_WritingResults: Lorry HEV non-OVC SUCCESS"), @@ -78,12 +83,12 @@ public class TestXMLResultsWriting TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, true, true, TestName = "ReportResult_WritingResults: Lorry HEV exempted"), TestCase(VectoSimulationJobType.ConventionalVehicle, true, true, true, TestName = "ReportResult_WritingResults: Lorry Conv exempted"), ] - public void TestReportResult_WritingResults_Lorry(VectoSimulationJobType jobType, bool ovc, bool exempted, bool success) + public void TestReportResult_WritingResults_Lorry(VectoSimulationJobType jobType, bool ovc, bool exempted, bool success, params FuelType[] fuels) { var vehicleCategory = VehicleCategory.RigidTruck; var ovcmode = ovc ? VectoRunData.OvcHevMode.ChargeDepleting : VectoRunData.OvcHevMode.NotApplicable; - var runData = GetMockRunData(vehicleCategory, jobType, ovc, exempted, ovcmode); - var modData = GetMockModData(success ? VectoRun.Status.Success : VectoRun.Status.Aborted); + var runData = GetMockRunData(vehicleCategory, jobType, ovc, exempted, ovcmode, fuels); + var modData = GetMockModData(success ? VectoRun.Status.Success : VectoRun.Status.Aborted, fuels); var resultEntries = new List<IResultEntry>(); @@ -92,7 +97,7 @@ public class TestXMLResultsWriting resultEntries.Add(resultEntry); if (ovc && jobType.GetPowertrainArchitectureType() == VectoSimulationJobTypeHelper.Hybrid) { - var run2 = GetMockRunData(vehicleCategory, jobType, true, exempted, VectoRunData.OvcHevMode.ChargeSustaining); + var run2 = GetMockRunData(vehicleCategory, jobType, true, exempted, VectoRunData.OvcHevMode.ChargeSustaining, fuels); var res2 = GetResultEntry(run2); res2.SetResultData(run2, modData, 1); resultEntries.Add(res2); @@ -120,9 +125,13 @@ public class TestXMLResultsWriting [ TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, TestName = "ReportResult_WritingResults: CompletedBus Conv SUCCESS"), + TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, FuelType.NGCI, FuelType.DieselCI, TestName = "ReportResult_WritingResults: CompletedBus Conv DualFuel SUCCESS"), + TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, true, FuelType.NGPI, TestName = "ReportResult_WritingResults: CompletedBus Conv LNG SUCCESS"), TestCase(VectoSimulationJobType.ConventionalVehicle, false, false, false, TestName = "ReportResult_WritingResults: CompletedBus Conv ERROR"), TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, true, TestName = "ReportResult_WritingResults: CompletedBus HEV OVC SUCCESS"), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, true, FuelType.NGCI, FuelType.DieselCI, TestName = "ReportResult_WritingResults: CompletedBus HEV OVC DualFuel SUCCESS"), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, true, FuelType.NGPI, TestName = "ReportResult_WritingResults: CompletedBus HEV OVC LNG SUCCESS"), TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, false, false, TestName = "ReportResult_WritingResults: CompletedBus HEV OVC ERROR"), TestCase(VectoSimulationJobType.ParallelHybridVehicle, false, false, true, TestName = "ReportResult_WritingResults: CompletedBus HEV non-OVC SUCCESS"), @@ -133,12 +142,12 @@ public class TestXMLResultsWriting TestCase(VectoSimulationJobType.ParallelHybridVehicle, true, true, true, TestName = "ReportResult_WritingResults: CompletedBus HEV exempted"), ] - public void TestReportResult_WritingResults_CompletedBus(VectoSimulationJobType jobType, bool ovc, bool exempted, bool success) + public void TestReportResult_WritingResults_CompletedBus(VectoSimulationJobType jobType, bool ovc, bool exempted, bool success, params FuelType[] fuels) { var vehicleCategory = VehicleCategory.HeavyBusCompletedVehicle; var ovcmode = ovc ? VectoRunData.OvcHevMode.ChargeDepleting : VectoRunData.OvcHevMode.NotApplicable; - var runData = GetMockRunData(vehicleCategory, jobType, ovc, exempted, ovcmode); - var modData = GetMockModData(success ? VectoRun.Status.Success : VectoRun.Status.Aborted); + var runData = GetMockRunData(vehicleCategory, jobType, ovc, exempted, ovcmode, fuels); + var modData = GetMockModData(success ? VectoRun.Status.Success : VectoRun.Status.Aborted, fuels); var resultEntries = new List<IResultEntry>(); @@ -153,7 +162,7 @@ public class TestXMLResultsWriting } if (ovc && jobType.GetPowertrainArchitectureType() == VectoSimulationJobTypeHelper.Hybrid) { - var run2 = GetMockRunData(vehicleCategory, jobType, true, exempted, VectoRunData.OvcHevMode.ChargeSustaining); + var run2 = GetMockRunData(vehicleCategory, jobType, true, exempted, VectoRunData.OvcHevMode.ChargeSustaining, fuels); var res2 = GetResultEntry(run2); res2.SetResultData(run2, modData, 1); resultEntries.Add(res2); @@ -226,7 +235,13 @@ public class TestXMLResultsWriting var category = runData.VehicleData.VehicleCategory.IsLorry() ? "Lorry" : "Bus"; var suffix = success ? null : "_ERR"; var exept = exempted ? "_exempted" : null; - return $"CIF_MockupResults_{arch}_{category}{suffix}{exept}.xml"; + + var fuelSuffix = ""; + var fuels = runData.EngineData.Fuels; + if (fuels.Any(x => x.FuelData.FuelType != FuelType.DieselCI)) { + fuelSuffix = "_" + fuels.Select(x => x.FuelData.FuelType.ToXMLFormat().Replace(' ', '-')).Join("_"); + } + return $"CIF_MockupResults_{arch}_{category}{fuelSuffix}{suffix}{exept}.xml"; } @@ -270,8 +285,10 @@ public class TestXMLResultsWriting return doc; } - private IModalDataContainer GetMockModData(VectoRun.Status runStatus) + private IModalDataContainer GetMockModData(VectoRun.Status runStatus, FuelType[] fuelTypes) { + var fuels = fuelTypes == null || fuelTypes.Length == 0 ? new[] { FuelType.DieselCI } : fuelTypes; + var modData = new Mock<IModalDataContainer>(); modData.Setup(x => x.RunStatus).Returns(runStatus); modData.Setup(x => x.Duration).Returns(3600.SI<Second>()); @@ -293,15 +310,19 @@ public class TestXMLResultsWriting } var mc = new Mock<ICorrectedModalData>(); - var fc = new Mock<IFuelConsumptionCorrection>(); modData.Setup(x => x.CorrectedModalData).Returns(mc.Object); - mc.Setup(x => x.FuelCorrection).Returns(new Dictionary<FuelType, IFuelConsumptionCorrection>() { - { FuelType.DieselCI, fc.Object } - }); - fc.Setup(x => x.Fuel).Returns(FuelData.Diesel); - fc.Setup(x => x.TotalFuelConsumptionCorrected).Returns(31.SI<Kilogram>()); - fc.Setup(x => x.EnergyDemand).Returns(31.SI<Kilogram>() * FuelData.Diesel.LowerHeatingValueVecto); + var fcCorrected = new Dictionary<FuelType, IFuelConsumptionCorrection>(); + foreach (var fuelType in fuels) { + var factor = fcCorrected.Count == 0 ? 1 : 0.1; + var fc = new Mock<IFuelConsumptionCorrection>(); + fc.Setup(x => x.Fuel).Returns(DeclarationData.FuelData.Lookup(fuelType, TankSystem.Liquefied)); + fc.Setup(x => x.TotalFuelConsumptionCorrected).Returns(31.SI<Kilogram>() * factor); + fc.Setup(x => x.EnergyDemand).Returns(31.SI<Kilogram>() * factor * FuelData.Diesel.LowerHeatingValueVecto); + fcCorrected.Add(fuelType, fc.Object); + } + mc.Setup(x => x.FuelCorrection).Returns(fcCorrected); + mc.Setup(x => x.CO2Total).Returns(20.SI<Kilogram>()); mc.Setup(x => x.FuelEnergyConsumptionTotal).Returns(1e9.SI<Joule>()); mc.Setup(x => x.ElectricEnergyConsumption).Returns(200.SI(Unit.SI.Mega.Joule).Cast<WattSecond>()); @@ -312,8 +333,9 @@ public class TestXMLResultsWriting } private VectoRunData GetMockRunData(VehicleCategory vehicleCategory, VectoSimulationJobType jobType, - bool offVehicleCharging, bool exempted, VectoRunData.OvcHevMode ovcMode) + bool offVehicleCharging, bool exempted, VectoRunData.OvcHevMode ovcMode, FuelType[] fuelTypes) { + var fuels = fuelTypes == null || fuelTypes.Length == 0 ? new [] { FuelType.DieselCI } : fuelTypes; return new VectoRunData() { Mission = new Mission() { MissionType = MissionType.LongHaul @@ -333,12 +355,8 @@ public class TestXMLResultsWriting }, EngineData = new CombustionEngineData() { FuelMode = 0, - Fuels = new List<CombustionEngineFuelData>() { - new CombustionEngineFuelData() { - FuelData = FuelData.Diesel, - - } - } + Fuels = fuels.Select(x => new CombustionEngineFuelData() + { FuelData = DeclarationData.FuelData.Lookup(x, TankSystem.Liquefied) }).ToList(), }, Retarder = new RetarderData() { Type = RetarderType.None,