diff --git a/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs index a42cde68ce534a5bf772d8a1fdbacf07557dc2a0..ff408d8e3b1aacf40c23dac98377ceab056b316b 100644 --- a/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/BatteryElectricPostprocessingCorrection.cs @@ -13,7 +13,7 @@ namespace TUGraz.VectoCore.OutputData { return new PEVCorrectedModalData(modData) { - ElectricEnergyConsumption = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int), + ElectricEnergyConsumption = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int), }; } diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index 0ffd88cb8096a1cb7971788c03df01ac5353aebf..72fb43af5e5ea928cc2e199dec6ccf21f0bdd3e1 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -182,6 +182,7 @@ namespace TUGraz.VectoCore.OutputData Kilogram CO2Total { get; } Joule FuelEnergyConsumptionTotal { get; } WattSecond ElectricEnergyConsumption { get; set; } + WattSecondPerMeter ElectricEnergyConsumptionPerMeter { get; } } public interface IFuelConsumptionCorrection diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index e234d5f6b6a41a74ac8b981aafca13f97baaac61..71332e59e88cdbe1c047ae1adadb04db99eb5a2b 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -126,6 +126,9 @@ namespace TUGraz.VectoCore.OutputData case VectoSimulationJobType.IEPC_S: case VectoSimulationJobType.SerialHybridVehicle: return new SerialHybridModalDataPostprocessingCorrection(); + case VectoSimulationJobType.IHPC: + case VectoSimulationJobType.ParallelHybridVehicle: + return new ParallelHybridModalDataPostprocessingCorrection(); case VectoSimulationJobType.EngineOnlySimulation: return new EngineOnlyPostprocessingCorrection(); default: diff --git a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs index 032af85fb36b39c174ce092307529dedc3d41224..09b1f2a1bdee68ddd1cb9e8f3d20e97f6251da0e 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs @@ -22,7 +22,7 @@ namespace TUGraz.VectoCore.OutputData public virtual ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) { var essParams = runData.DriverData.EngineStopStart; - var r = new CorrectedModalData { + var r = new CorrectedModalData (modData){ UtilityFactorDriving = essParams.UtilityFactorDriving, UtilityFactorStandstill = essParams.UtilityFactorStandstill }; @@ -339,14 +339,30 @@ namespace TUGraz.VectoCore.OutputData } } - public class CorrectedModalData : ICorrectedModalData + public abstract class AbstractCorrectedModalData + { + protected readonly IModalDataContainer _modData; + + public AbstractCorrectedModalData(IModalDataContainer modData) + { + _modData = modData; + } + public abstract WattSecond ElectricEnergyConsumption { get; set; } + + public WattSecondPerMeter ElectricEnergyConsumptionPerMeter => ElectricEnergyConsumption == null + ? null + : ElectricEnergyConsumption / _modData.Distance; + } + + public class CorrectedModalData : AbstractCorrectedModalData, ICorrectedModalData { public SI kAir { get; set; } public Dictionary<FuelType, IFuelConsumptionCorrection> FuelCorrection { get; } #region Implementation of ICorrectedModalData - public CorrectedModalData() + public CorrectedModalData(IModalDataContainer modData) : base(modData) { + FuelCorrection = new Dictionary<FuelType, IFuelConsumptionCorrection>(); } @@ -401,7 +417,9 @@ namespace TUGraz.VectoCore.OutputData } } - public WattSecond ElectricEnergyConsumption { get; set; } + public override WattSecond ElectricEnergyConsumption { get; set; } + + public Second ICEOffTimeStandstill { get; set; } public WattSecond EnergyAuxICEOffStandstill { get; set; } @@ -532,14 +550,12 @@ namespace TUGraz.VectoCore.OutputData } - public class PEVCorrectedModalData : ICorrectedModalData + public class PEVCorrectedModalData : AbstractCorrectedModalData, ICorrectedModalData { - private IModalDataContainer _modData; - public PEVCorrectedModalData(IModalDataContainer modData) + public PEVCorrectedModalData(IModalDataContainer modData) : base(modData) { - _modData = modData; - + } #region Implementation of ICorrectedModalData @@ -566,7 +582,7 @@ 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 WattSecond ElectricEnergyConsumption { get; set; } = 0.SI<WattSecond>(); + public override WattSecond ElectricEnergyConsumption { get; set; } = 0.SI<WattSecond>(); #endregion } diff --git a/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs index e6b201e57b5067e6e51cbf7a6060b03c50f9b236..30e1def1114f5a9a22b6b1f811c5bc04550814a4 100644 --- a/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ParallelHybridModalDataPostprocessingCorrection.cs @@ -1,7 +1,22 @@ -namespace TUGraz.VectoCore.OutputData +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Simulation.Data; + +namespace TUGraz.VectoCore.OutputData { public class ParallelHybridModalDataPostprocessingCorrection : ModalDataPostprocessingCorrection { + #region Overrides of ModalDataPostprocessingCorrection + + public override ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) + { + var r = base.ApplyCorrection(modData, runData); + + + + r.ElectricEnergyConsumption = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); + return r; + } + #endregion } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs index 094ef7f60b6808af25f65d4ae850c6d586501676..535ad47a1095680a7db5fe6d469f4d676f9c7d57 100644 --- a/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/SerialHybridModalDataPostprocessingCorrection.cs @@ -16,7 +16,7 @@ namespace TUGraz.VectoCore.OutputData - r.ElectricEnergyConsumption = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); + r.ElectricEnergyConsumption = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int); return r; } diff --git a/VectoCore/VectoCore/OutputData/SumDataFields.cs b/VectoCore/VectoCore/OutputData/SumDataFields.cs index c0cb8026c3aacd46019c1a6bcfb811fe2438ef62..d940b9ee943cc1d51bfa40fce7e66e5bbaf178d1 100644 --- a/VectoCore/VectoCore/OutputData/SumDataFields.cs +++ b/VectoCore/VectoCore/OutputData/SumDataFields.cs @@ -124,7 +124,11 @@ 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 ElectricEnergyConsumptionPerKm = "EC_el_final [kWh/km]"; + public const string ElectricEnergyConsumption_total = "EC_el_final [kWh]"; + public const string ElectricEnergyConsumption_KM = "EC_el_final [kWh/km]"; + public const string ElectricEnergyConsumption_TKM = "EC_el_final [kWh/tkm]"; + public const string ElectricEnergyConsumption_M3KM = "EC_el_final [g/m³km]"; + public const string ElectricEnergyConsumption_PKM = "EC_el_final [g/Pkm]"; public const string CO2_KM = "CO2 [g/km]"; public const string CO2_TKM = "CO2 [g/tkm]"; @@ -603,8 +607,17 @@ namespace TUGraz.VectoCore.OutputData { CO2_PKM, SumFunc((r, m) => r.VehicleData?.PassengerCount == null ? null : (m.CorrectedModalData.KilogramCO2PerMeter / r.VehicleData.PassengerCount.Value).ConvertToGrammPerKiloMeter(), ModalResultField.dist) }, // electric consumption - { ElectricEnergyConsumptionPerKm, SumFunc((r, m) => (-m.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / m.Distance).Cast<JoulePerMeter>().ConvertToKiloWattHourPerKiloMeter(), ModalResultField.P_reess_int)}, - + { ElectricEnergyConsumption_total, SumFunc( (r , m ) + => (m.CorrectedModalData.ElectricEnergyConsumption.ConvertToKiloWattHour()))}, + { ElectricEnergyConsumption_KM, SumFunc((r, m) + => (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter).ConvertToKiloWattHourPerKiloMeter())}, + { ElectricEnergyConsumption_TKM, SumFunc((r, m) + => r.VehicleData?.Loading == null || r.VehicleData.Loading.IsEqual(0) ? null : + (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter / r.VehicleData.Loading).ConvertToKiloWattHourPerTonKiloMeter())}, + { ElectricEnergyConsumption_M3KM, SumFunc((r, m) => r.VehicleData.CargoVolume == null || r.VehicleData.CargoVolume.IsEqual(0) ? null : + (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter / r.VehicleData.CargoVolume).ConvertToKiloWattHourPerCubicMeterKiloMeter())}, + { ElectricEnergyConsumption_PKM, SumFunc((r, m) => r.VehicleData?.PassengerCount == null ? null : + (m.CorrectedModalData.ElectricEnergyConsumptionPerMeter / r.VehicleData.PassengerCount.Value).ConvertToKiloWattHourPerPassengerKiloMeter())}, // {, SumFunc((r, m) =>)}, }; diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 7f2efb5f2bf92e52ca3f0db48a6ae15b8f23e475..ab9e25f8842046f383141bb874d65360a087e812 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -326,6 +326,15 @@ namespace TUGraz.VectoCore.OutputData Tuple.Create(SumDataFields.CO2_PKM, typeof(ConvertedSI)), }; + public static readonly Tuple<string, Type>[] ElectricEnergyConsumption = { + Tuple.Create(SumDataFields.ElectricEnergyConsumption_total, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ElectricEnergyConsumption_KM, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ElectricEnergyConsumption_TKM, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ElectricEnergyConsumption_M3KM, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ElectricEnergyConsumption_PKM, typeof(ConvertedSI)), + }; + + public static readonly Tuple<string, Type>[] VTPCycleColumns = { Tuple.Create(SumDataFields.E_WHEEL, typeof(ConvertedSI)), }; @@ -375,6 +384,7 @@ namespace TUGraz.VectoCore.OutputData //InitTableColumns(); CreateColumns(CommonColumns); CreateColumns(CO2Columns); + CreateColumns(ElectricEnergyConsumption); } public void RegisterComponent(VectoSimulationComponent component, VectoRunData runData) @@ -616,6 +626,14 @@ namespace TUGraz.VectoCore.OutputData SumDataFields.E_FCMAP_NEG, SumDataFields.E_POWERTRAIN_INERTIA, }); + + cols.AddRange(new [] { + SumDataFields.ElectricEnergyConsumption_total, + SumDataFields.ElectricEnergyConsumption_KM, + SumDataFields.ElectricEnergyConsumption_TKM, + SumDataFields.ElectricEnergyConsumption_M3KM, + SumDataFields.ElectricEnergyConsumption_PKM, + }); cols.AddRange(AuxColumns.OrderBy(x => x)); cols.AddRange(new[] { SumDataFields.E_AUX, @@ -1034,15 +1052,15 @@ namespace TUGraz.VectoCore.OutputData // } else { // if (runData.ElectricMachinesData.Count > 0) { // //lock (Table) { - // // if (!Table.Columns.Contains(SumDataFields.ElectricEnergyConsumptionPerKm)) { + // // if (!Table.Columns.Contains(SumDataFields.ElectricEnergyConsumption_KM)) { // // lock (_tableLock) { - // // var col = Table.Columns.Add(SumDataFields.ElectricEnergyConsumptionPerKm, typeof(ConvertedSI)); + // // var col = Table.Columns.Add(SumDataFields.ElectricEnergyConsumption_KM, typeof(ConvertedSI)); // // col.SetOrdinal(Table.Columns[SumDataFields.CO2_KM].Ordinal); // // } // // } // //} - // //row[SumDataFields.ElectricEnergyConsumptionPerKm] = + // //row[SumDataFields.ElectricEnergyConsumption_KM] = // // (-modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / modData.Distance).Cast<JoulePerMeter>().ConvertToKiloWattHourPerKiloMeter(); // } // } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/AbstractCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/AbstractCustomerReport.cs index c6152a5c536ec784d69260b0f61ddfc1295218ce..1d440574bc42aeaa6c09983c2b9ccb22d717f70d 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/AbstractCustomerReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/AbstractCustomerReport.cs @@ -96,8 +96,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation ) ); - - var lh = results.SingleOrDefault(res => res.Mission == MissionType.LongHaul && res.LoadingType == LoadingType.ReferenceLoad); + // ReSharper disable once PossibleNullReferenceException Vehicle.XPathSelectElement($"//*[local-name()='{XMLNames.VehicleGroupCO2}']").Value = DeclarationData .GetVehicleGroupCO2StandardsGroup(Input).ToXMLFormat();