diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 9bf4b71ea28cb644c0d0d56b44f590e6173ebf39..2be73e6a8148618c6ecd1aa26b154b709e5c8370 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -1437,7 +1437,7 @@ namespace TUGraz.VectoCore.Models.Declaration var D13_realWorldFactorUsageStartSoC = vehicleOperation.RealWorldUsageFactors.StartSoCBeforeMission; var D14_realWorldFactorChargeDuringMission = vehicleOperation.RealWorldUsageFactors.StationaryChargingDuringMission; - var (etaChgBatDepot, etaChgBatInMission, etaChtBatWeighted) = CalculateChargingEfficiency(cdResult, vehicleOperation, batteryData); + var (etaChgBatDepot, etaChgBatInMission, etaChtBatWeighted) = CalculateChargingEfficiencyOVCHEV(cdResult.MaxChargingPower, vehicleOperation, batteryData); var D17_maxStatChargingPower = cdResult.MaxChargingPower; @@ -1503,13 +1503,13 @@ namespace TUGraz.VectoCore.Models.Declaration return retVal; } - private static (double, double, double) CalculateChargingEfficiency(IResultEntry cdResult, + public static (double, double, double) CalculateChargingEfficiencyOVCHEV(Watt maxChargingPwrVeh, VehicleOperationLookup.VehicleOperationData vehicleOperation, BatterySystemData batteryData) { var depotChargingPower = VectoMath.Max(MinDepotChgPwr, batteryData.UseableStoredEnergy / DepotChargingDuration); var inMissionChargingPower = VectoMath.Min(vehicleOperation.StationaryChargingMaxPwrInfrastructure, - cdResult.MaxChargingPower); + maxChargingPwrVeh); var tmpBattery = new BatterySystem(null, batteryData); var centerSoC = (tmpBattery.MinSoC + tmpBattery.MaxSoC) / 2.0; @@ -1535,7 +1535,7 @@ namespace TUGraz.VectoCore.Models.Declaration totalChargedEnergy); } - private static double CalculateChargingEfficiency(VectoRunData runData) + public static double CalculateChargingEfficiencyPEV(VectoRunData runData) { var batteryData = runData.BatteryData; var tmpBattery = new BatterySystem(null, batteryData); @@ -1627,9 +1627,9 @@ namespace TUGraz.VectoCore.Models.Declaration throw new VectoException("Battery Data is required for PEV range calculation"); } - var D9_chargingEfficiencyBattery = CalculateChargingEfficiency(runData); + var D9_chargingEfficiencyBattery = CalculateChargingEfficiencyPEV(runData); var D15_useableBatteryCapacityForR_CDA = batteryData.UseableStoredEnergy; - var D13_electricEnergyConsumption = data.CorrectedModalData.ElectricEnergyConsumption; + var D13_electricEnergyConsumption = data.CorrectedModalData.ElectricEnergyConsumption_SoC; var D16_actualChargeDepletingRange = D15_useableBatteryCapacityForR_CDA / D13_electricEnergyConsumption * data.Distance; var D17_equivalentAllElectricRange = D16_actualChargeDepletingRange; diff --git a/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs index ff408d8e3b1aacf40c23dac98377ceab056b316b..5fac213fb3cc63a2d84a62c26eeb114c21e5b9c3 100644 --- a/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; namespace TUGraz.VectoCore.OutputData @@ -11,9 +12,11 @@ namespace TUGraz.VectoCore.OutputData public ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) { - + var chgEfficiency = DeclarationData.CalculateChargingEfficiencyPEV(runData); + return new PEVCorrectedModalData(modData) { - ElectricEnergyConsumption = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int), + ElectricEnergyConsumption_SoC = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int), + ElectricEnergyConsumption_Final = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / chgEfficiency, }; } diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index e4ad65195294c848daab8668856b31327bffcbc5..f60b2be6bbe2315b4f1f645a73b3e9724a34cd8f 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -181,8 +181,12 @@ namespace TUGraz.VectoCore.OutputData Dictionary<FuelType, IFuelConsumptionCorrection> FuelCorrection { get; } Kilogram CO2Total { get; } Joule FuelEnergyConsumptionTotal { get; } - WattSecond ElectricEnergyConsumption { get; set; } - WattSecondPerMeter ElectricEnergyConsumptionPerMeter { get; } + WattSecond ElectricEnergyConsumption_SoC { get; set; } + WattSecondPerMeter ElectricEnergyConsumption_SoC_PerMeter { get; } + + WattSecond ElectricEnergyConsumption_Final { get; set; } + WattSecondPerMeter ElectricEnergyConsumption_Final_PerMeter { get; } + } public interface IFuelConsumptionCorrection diff --git a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs index 55409fd07eb5ae0b5e93505ee429a416591278c9..156de15148224afcd04f433420083916f296e756 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs @@ -347,11 +347,18 @@ namespace TUGraz.VectoCore.OutputData { _modData = modData; } - public abstract WattSecond ElectricEnergyConsumption { get; set; } + public abstract WattSecond ElectricEnergyConsumption_SoC { get; set; } - public WattSecondPerMeter ElectricEnergyConsumptionPerMeter => ElectricEnergyConsumption == null || _modData.Distance.IsEqual(0) + public abstract WattSecond ElectricEnergyConsumption_Final { get; set; } + + public WattSecondPerMeter ElectricEnergyConsumption_SoC_PerMeter => ElectricEnergyConsumption_SoC == null || _modData.Distance.IsEqual(0) ? null - : ElectricEnergyConsumption / _modData.Distance; + : ElectricEnergyConsumption_SoC / _modData.Distance; + + public WattSecondPerMeter ElectricEnergyConsumption_Final_PerMeter => + ElectricEnergyConsumption_Final == null || _modData.Distance.IsEqual(0) + ? null + : ElectricEnergyConsumption_Final / _modData.Distance; } public class CorrectedModalData : AbstractCorrectedModalData, ICorrectedModalData @@ -417,9 +424,8 @@ namespace TUGraz.VectoCore.OutputData } } - public override WattSecond ElectricEnergyConsumption { get; set; } - - + public override WattSecond ElectricEnergyConsumption_SoC { get; set; } + public override WattSecond ElectricEnergyConsumption_Final { get; set; } public Second ICEOffTimeStandstill { get; set; } public WattSecond EnergyAuxICEOffStandstill { get; set; } @@ -582,7 +588,8 @@ namespace TUGraz.VectoCore.OutputData public Dictionary<FuelType, IFuelConsumptionCorrection> FuelCorrection => new Dictionary<FuelType, IFuelConsumptionCorrection>(); public Kilogram CO2Total => 0.SI<Kilogram>(); public Joule FuelEnergyConsumptionTotal => 0.SI<Joule>(); - public override WattSecond ElectricEnergyConsumption { get; set; } = 0.SI<WattSecond>(); + public override WattSecond ElectricEnergyConsumption_SoC { get; set; } = 0.SI<WattSecond>(); + public override WattSecond ElectricEnergyConsumption_Final { get; set; } = 0.SI<WattSecond>(); #endregion } diff --git a/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs index 30e1def1114f5a9a22b6b1f811c5bc04550814a4..c8a16414dcdc34b26e7b9f773eaffc37f09413cd 100644 --- a/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs @@ -1,4 +1,5 @@ using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; namespace TUGraz.VectoCore.OutputData @@ -10,10 +11,18 @@ namespace TUGraz.VectoCore.OutputData public override ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) { var r = base.ApplyCorrection(modData, runData); + + var vehicleOperation = DeclarationData.VehicleOperation.LookupVehicleOperation(runData.VehicleData.VehicleClass, runData.Mission.MissionType); + var etaChtBatWeighted = 1.0; + if (runData.OVCMode == VectoRunData.OvcHevMode.ChargeDepleting) { + (_, _, etaChtBatWeighted) = + DeclarationData.CalculateChargingEfficiencyOVCHEV(runData.MaxChargingPower, vehicleOperation, + runData.BatteryData); + } - - r.ElectricEnergyConsumption = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); + r.ElectricEnergyConsumption_SoC = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); + r.ElectricEnergyConsumption_Final = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / etaChtBatWeighted; return r; } diff --git a/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs index 535ad47a1095680a7db5fe6d469f4d676f9c7d57..6428ed5582af1e23427a70def06b8bd3055dad22 100644 --- a/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs @@ -2,6 +2,7 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; namespace TUGraz.VectoCore.OutputData @@ -14,9 +15,14 @@ namespace TUGraz.VectoCore.OutputData { var r = base.ApplyCorrection(modData, runData); + var chgEfficiency = 1.0; - - r.ElectricEnergyConsumption = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); + if (runData.OVCMode == VectoRunData.OvcHevMode.ChargeDepleting) { + chgEfficiency = DeclarationData.CalculateChargingEfficiencyPEV(runData); + } + r.ElectricEnergyConsumption_SoC = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); + r.ElectricEnergyConsumption_Final = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / chgEfficiency; + return r; } diff --git a/VectoCore/VectoCore/OutputData/SumDataFields.cs b/VectoCore/VectoCore/OutputData/SumDataFields.cs index 5e9c1809d1ec45bebcb77ee44314e3dde374963e..376ba885d807559d41ec774a9a2a00fb93cfb396 100644 --- a/VectoCore/VectoCore/OutputData/SumDataFields.cs +++ b/VectoCore/VectoCore/OutputData/SumDataFields.cs @@ -125,6 +125,8 @@ namespace TUGraz.VectoCore.OutputData public const string FCFINAL_LiterPer100M3KM = "FC-Final{0} [l/100m³km]"; public const string FCFINAL_LiterPer100PassengerKM = "FC-Final{0} [l/100Pkm]"; + public const string EC_el_SOC = "EC_el_SoC [kWh"; + public const string EC_el_final = "EC_el_final [kWh]"; public const string EC_el_final_KM = "EC_el_final [kWh/km]"; public const string EC_el_final_TKM = "EC_el_final [kWh/tkm]"; @@ -645,25 +647,26 @@ namespace TUGraz.VectoCore.OutputData null : (m.CorrectedModalData.KilogramCO2PerMeter / r.VehicleData.PassengerCount.Value).ConvertToGrammPerKiloMeter(), ModalResultField.dist) }, // electric consumption + { EC_el_SOC, SumFunc( (r, m) => + m.CorrectedModalData.ElectricEnergyConsumption_SoC?.ConvertToKiloWattHour()) }, { EC_el_final, SumFunc( (r , m ) - => (m.CorrectedModalData.ElectricEnergyConsumption?.ConvertToKiloWattHour()))}, + => (m.CorrectedModalData.ElectricEnergyConsumption_Final?.ConvertToKiloWattHour()))}, { EC_el_final_KM, SumFunc((r, m) - => (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter)?.ConvertToKiloWattHourPerKiloMeter())}, + => (m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter)?.ConvertToKiloWattHourPerKiloMeter())}, { EC_el_final_TKM, SumFunc((r, m) => r.VehicleData?.Loading == null || r.VehicleData.Loading.IsEqual(0) || - m.CorrectedModalData.ElectricEnergyConsumption == null || - m.CorrectedModalData.ElectricEnergyConsumptionPerMeter == null - ? null : (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter / r.VehicleData.Loading).ConvertToKiloWattHourPerTonKiloMeter())}, + m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter == null + ? null : (m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter / r.VehicleData.Loading).ConvertToKiloWattHourPerTonKiloMeter())}, { EC_el_final_M3KM, SumFunc((r, m) => r.VehicleData.CargoVolume == null || r.VehicleData.CargoVolume.IsEqual(0) || - m.CorrectedModalData.ElectricEnergyConsumption == null || - m.CorrectedModalData.ElectricEnergyConsumptionPerMeter == null - ? null : (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter / r.VehicleData.CargoVolume).ConvertToKiloWattHourPerCubicMeterKiloMeter())}, + m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter == null + ? null : (m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter / r.VehicleData.CargoVolume).ConvertToKiloWattHourPerCubicMeterKiloMeter())}, { ElectricEnergyConsumption_PKM, SumFunc((r, m) - => r.VehicleData?.PassengerCount == null || m.CorrectedModalData.ElectricEnergyConsumption == null || m.CorrectedModalData.ElectricEnergyConsumptionPerMeter == null ? - null : (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter / r.VehicleData.PassengerCount.Value).ConvertToKiloWattHourPerPassengerKiloMeter())}, + => r.VehicleData?.PassengerCount == null || + m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter == null + ? null : (m.CorrectedModalData.ElectricEnergyConsumption_Final_PerMeter / r.VehicleData.PassengerCount.Value).ConvertToKiloWattHourPerPassengerKiloMeter())}, // {, SumFunc((r, m) =>)}, }; diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index eeacb42e5ee7d6fa0d617b0f48183a07756510eb..a1b81d704e32d4bc319a36df402bc3c12dc068d5 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -352,6 +352,7 @@ namespace TUGraz.VectoCore.OutputData }; public static readonly Tuple<string, Type>[] ElectricEnergyConsumption = { + Tuple.Create(SumDataFields.EC_el_SOC, typeof(ConvertedSI)), Tuple.Create(SumDataFields.EC_el_final, typeof(ConvertedSI)), Tuple.Create(SumDataFields.EC_el_final_KM, typeof(ConvertedSI)), Tuple.Create(SumDataFields.EC_el_final_TKM, typeof(ConvertedSI)), @@ -663,6 +664,7 @@ namespace TUGraz.VectoCore.OutputData }); cols.AddRange(new [] { + SumDataFields.EC_el_SOC, SumDataFields.EC_el_final, SumDataFields.EC_el_final_KM, SumDataFields.EC_el_final_TKM, diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index 25ca624844800164a39fbc558b8dbe0ef0389288..4efce2efc9f0e0345c56acce6957f6229c0896c8 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -220,7 +220,7 @@ namespace TUGraz.VectoCore.OutputData.XML CorrectedFinalFuelConsumption = data.CorrectedModalData.FuelCorrection; CO2Total = data.CorrectedModalData.CO2Total; EnergyConsumptionTotal = data.CorrectedModalData.FuelEnergyConsumptionTotal; - ElectricEnergyConsumption = data.CorrectedModalData.ElectricEnergyConsumption; + ElectricEnergyConsumption = data.CorrectedModalData.ElectricEnergyConsumption_SoC; if (runData.JobType.IsOneOf(VectoSimulationJobType.BatteryElectricVehicle, VectoSimulationJobType.IEPC_E)) { diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/LorrySimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/LorrySimulation.cs index 6c45472c5aa7e865b71d5a22f3dd0d4e948b19a3..966395b6b3641a24c8f072b4d8bc4d65f1f9a41b 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/LorrySimulation.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/LorrySimulation.cs @@ -376,6 +376,7 @@ public class LorrySimulation SumDataFields.CO2_M3KM, }; var EC_el = new List<string> { + SumDataFields.EC_el_SOC, SumDataFields.EC_el_final, SumDataFields.EC_el_final_KM, SumDataFields.EC_el_final_TKM, @@ -922,7 +923,7 @@ public class LorrySimulation writeReports ? null : new NullDeclarationReport()); //, writeReports ? null : new NullDeclarationReport()); DisableIterativeRuns(runsFactory); runsFactory.WriteModalResults = true; - var sumWriter = new MockSumWriter(); + var sumWriter = new SummaryDataContainer(fileWriter); //new MockSumWriter(); var jobContainer = new JobContainer(sumWriter); runsFactory.SumData = sumWriter; diff --git a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs index 715ef63d83fd88c9a1c82189b45e89c040c96bdf..25723628bbd5543c136542285a80ed54a4a05a0f 100644 --- a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs +++ b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs @@ -620,7 +620,7 @@ public class TestXMLResultsWriting mc.Setup(x => x.FuelEnergyConsumptionTotal).Returns(1e9.SI<Joule>()); var elOvcFactor = ovcMode == VectoRunData.OvcHevMode.ChargeSustaining ? 0 : 1.0; - mc.Setup(x => x.ElectricEnergyConsumption).Returns(200.SI(Unit.SI.Mega.Joule).Cast<WattSecond>() * elOvcFactor); + mc.Setup(x => x.ElectricEnergyConsumption_SoC).Returns(200.SI(Unit.SI.Mega.Joule).Cast<WattSecond>() * elOvcFactor); return modData.Object; }