diff --git a/Documentation/User Manual Source/Release Notes Vecto3.x.pdf b/Documentation/User Manual Source/Release Notes Vecto3.x.pdf index fe4a9057fd06ea12cd30ff6aa1ae1244ac1f0e9c..6ac6b262a72c2d7bd76a9b01d18d80002d962f70 100644 Binary files a/Documentation/User Manual Source/Release Notes Vecto3.x.pdf and b/Documentation/User Manual Source/Release Notes Vecto3.x.pdf differ diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs index 7c288f190e4c1c910a34c4d69fd98f449200b404..faf4a3ea7f8e44abb7459958b474951b6c58e2dc 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs @@ -161,6 +161,9 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces public class HeaterDemandResult { + /// <summary> + /// Fuel heater (Diesel) + /// </summary> public Joule AuxHeater => HeaterPower.AuxHeaterPower * CycleTime; public WattSecond HeatPumpElectricEnergy => HeaterPower.HeatPumpPowerEl * CycleTime; diff --git a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/IModalDataPostProcessor.cs b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/IModalDataPostProcessor.cs index d0e3c60d49108d321634191ba85159d6c99d86b4..e1a932b3e8d2b8f188c534345473017bfadf692b 100644 --- a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/IModalDataPostProcessor.cs +++ b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/IModalDataPostProcessor.cs @@ -16,5 +16,6 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing public interface IModalDataPostProcessor { ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData); - } + + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/BatteryElectricPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/BatteryElectricPostprocessingCorrection.cs index 93c82e9ed057cff56258acd28dcdca7d63c1ec0d..dd358d499f721b75281f496a8e94a515e61f01b9 100644 --- a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/BatteryElectricPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/BatteryElectricPostprocessingCorrection.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; +using System.Linq; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRunDataFactory; using TUGraz.VectoCore.Models.BusAuxiliaries; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; using TUGraz.VectoCore.Models.Declaration; @@ -9,11 +11,11 @@ using TUGraz.VectoCore.OutputData.ModDataPostprocessing; namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl { - public class BatteryElectricPostprocessingCorrection : IModalDataPostProcessor + public class BatteryElectricPostprocessingCorrection : ModalDataPostProcessingCorrectionBase { #region Implementation of IModalDataPostProcessor - public ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) + public override ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) { var chgEfficiency = DeclarationData.CalculateChargingEfficiencyPEV(runData); @@ -34,15 +36,34 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl runData.DCDCData.DCDCEfficiency; } + var corrected = new PEVCorrectedModalData(modData) + { + CorrectedAirDemand = airDemandCorr, + DeltaAir = deltaAir, + WorkBusAux_elPS_SoC_ElRange = deltaEPSel, + ElectricEnergyConsumption_SoC = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int), + ElectricEnergyConsumption_Final = (-modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) + deltaEPSel) / chgEfficiency, + }; - return new PEVCorrectedModalData(modData) { - CorrectedAirDemand = airDemandCorr, - DeltaAir = deltaAir, - WorkBusAux_elPS_SoC_ElRange = deltaEPSel, - ElectricEnergyConsumption_SoC = -modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int), - ElectricEnergyConsumption_Final = (-modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) + deltaEPSel) / chgEfficiency, - }; - } + SetAuxHeaterDemand(modData, runData, corrected); + if (corrected.AuxHeaterDemand?.IsGreater(0) ?? false) { + + var f = FuelData.Diesel; + + var fc = new PEVFuelConsumptionCorrection( + fuel: f, + distance: modData.Distance, + duration: modData.Duration, + fcAuxHeater: corrected.AuxHeaterDemand / f.LowerHeatingValueVecto); + + + corrected.FuelCorrection[f.FuelType] = fc; + } + + + + return corrected; + } #endregion } diff --git a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/ConventionalModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/ConventionalModalDataPostprocessingCorrection.cs index 28d1fe9724acb9a550caef4020951af829ccc23f..ad52825fa0789d1cfab31b7993234673f0807dc4 100644 --- a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/ConventionalModalDataPostprocessingCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/ConventionalModalDataPostprocessingCorrection.cs @@ -14,12 +14,62 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data; namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl { - public class ConventionalModalDataPostprocessingCorrection : IModalDataPostProcessor + public abstract class ModalDataPostProcessingCorrectionBase : IModalDataPostProcessor + { + #region Implementation of IModalDataPostProcessor + + public abstract ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData); + + protected virtual void SetAuxHeaterDemand(IModalDataContainer modData, VectoRunData runData, AbstractCorrectedModalData r) + { + + if (modData.AuxHeaterDemandCalc == null) + { + r.AuxHeaterDemand = 0.SI<Joule>(); + r.WorkBusAuxHeatPumpHeatingMech = 0.SI<WattSecond>(); + r.WorkBusAuxHeatPumpHeatingElMech = 0.SI<WattSecond>(); + r.WorkBusAuxElectricHeater = 0.SI<WattSecond>(); + return; + } + var duration = modData.Duration; + var engineWasteheatSum = modData.FuelData.Aggregate( + 0.SI<Joule>(), + (current, fuel) => current + modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel) * + fuel.LowerHeatingValueVecto); + var emLossEnergy = 0.SI<Joule>(); + //if (runData.ElectricMachinesData.Count > 0) { + foreach (var em in runData.ElectricMachinesData) + { + var emPos = em.Item1; //runData.ElectricMachinesData.First().Item1; + var colName = modData.GetColumnName(emPos, ModalResultField.P_EM_electricMotorLoss_); + if (emPos == PowertrainPosition.IEPC) + { + colName = modData.GetColumnName(emPos, ModalResultField.P_IEPC_electricMotorLoss_); + } + emLossEnergy += modData.TimeIntegral<WattSecond>(colName).Cast<Joule>(); + } + + //r.WorkBusAuxHeatPumpHeatingElMech = workBusAuxES / + // runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / + // runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; + var heatingDemand = modData.AuxHeaterDemandCalc(duration, engineWasteheatSum, emLossEnergy); + + r.WorkBusAuxHeatPumpHeatingMech = heatingDemand.HeatPumpMechanicalEnergy; + r.WorkBusAuxHeatPumpHeatingElMech = heatingDemand.HeatPumpElectricEnergy / + runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / + runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; + r.AuxHeaterDemand = heatingDemand.AuxHeater; + r.WorkBusAuxElectricHeater = heatingDemand.ElectricHeaterEnergy; + } + #endregion + } + + public class ConventionalModalDataPostprocessingCorrection : ModalDataPostProcessingCorrectionBase { #region Implementation of IModalDataPostProcessor - public virtual ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) + public override ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) { return DoApplyCorrection(modData, runData); } @@ -173,44 +223,7 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl return f; } - protected virtual void SetAuxHeaterDemand(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r) - { - - if (modData.AuxHeaterDemandCalc == null) { - r.AuxHeaterDemand = 0.SI<Joule>(); - r.WorkBusAuxHeatPumpHeatingMech = 0.SI<WattSecond>(); - r.WorkBusAuxHeatPumpHeatingElMech = 0.SI<WattSecond>(); - r.WorkBusAuxElectricHeater = 0.SI<WattSecond>(); - return; - } - var duration = modData.Duration; - var engineWasteheatSum = modData.FuelData.Aggregate( - 0.SI<Joule>(), - (current, fuel) => current + modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel) * - fuel.LowerHeatingValueVecto); - var emLossEnergy = 0.SI<Joule>(); - //if (runData.ElectricMachinesData.Count > 0) { - foreach (var em in runData.ElectricMachinesData) { - var emPos = em.Item1; //runData.ElectricMachinesData.First().Item1; - var colName = modData.GetColumnName(emPos, ModalResultField.P_EM_electricMotorLoss_); - if (emPos == PowertrainPosition.IEPC) { - colName = modData.GetColumnName(emPos, ModalResultField.P_IEPC_electricMotorLoss_); - } - emLossEnergy += modData.TimeIntegral<WattSecond>(colName).Cast<Joule>(); - } - - //r.WorkBusAuxHeatPumpHeatingElMech = workBusAuxES / - // runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / - // runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; - var heatingDemand = modData.AuxHeaterDemandCalc(duration, engineWasteheatSum, emLossEnergy); - r.WorkBusAuxHeatPumpHeatingMech = heatingDemand.HeatPumpMechanicalEnergy; - r.WorkBusAuxHeatPumpHeatingElMech = heatingDemand.HeatPumpElectricEnergy / - runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / - runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; - r.AuxHeaterDemand = heatingDemand.AuxHeater; - r.WorkBusAuxElectricHeater = heatingDemand.ElectricHeaterEnergy; - } protected virtual void SetMissingDCDCEnergy(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r) { diff --git a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/CorrectedModalData.cs b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/CorrectedModalData.cs index 579cedc96605c7b2bd4f108cacdbaa83c0de6b37..7e3c2a765a6ab8ccc0587a94addc9d7358b6d801 100644 --- a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/CorrectedModalData.cs +++ b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/CorrectedModalData.cs @@ -78,7 +78,7 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl public CorrectedModalData(IModalDataContainer modData) : base(modData) { - FuelCorrection = new Dictionary<FuelType, IFuelConsumptionCorrection>(); + //FuelCorrection = new Dictionary<FuelType, IFuelConsumptionCorrection>(); } public override IFuelConsumptionCorrection FuelConsumptionCorrection(IFuelProperties fuel) diff --git a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/FuelConsumptionCorrection.cs b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/FuelConsumptionCorrection.cs index 63fead479ed56fdd046d2ffaf4838336d9941684..1f3c6159d1faba02f699aa3b319339dae275b14b 100644 --- a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/FuelConsumptionCorrection.cs +++ b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/Impl/FuelConsumptionCorrection.cs @@ -1,5 +1,6 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl { @@ -127,4 +128,85 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing.Impl #endregion } + + + /// <summary> + /// Used for aux heaters + /// </summary> + public class PEVFuelConsumptionCorrection : IFuelConsumptionCorrection + { + private readonly Second _duration; + private readonly Meter _distance; + private readonly Kilogram _fcAuxHeater; + private readonly IFuelProperties _fuel; + + public PEVFuelConsumptionCorrection( + IFuelProperties fuel, + Second duration, + Meter distance, + Kilogram fcAuxHeater + ) + { + _fuel = fuel; + _duration = duration; + _distance = distance; + _fcAuxHeater = fcAuxHeater; + } + + #region Implementation of IFuelConsumptionCorrection + + public IFuelProperties Fuel => _fuel; + + public KilogramPerWattSecond EngineLineCorrectionFactor => throw new System.NotImplementedException(); + + public KilogramPerWattSecond VehicleLine => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_ESS_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_ESS_CORR_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_BusAux_PS_CORR_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_BusAux_ES_CORR_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_WHR_CORR_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_AUXHTR_H => _fcAuxHeater / _duration; + + public KilogramPerSecond FC_AUXHTR_H_CORR => FC_AUXHTR_H; + + public KilogramPerSecond FC_REESS_SOC_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_REESS_SOC_CORR_H => throw new System.NotImplementedException(); + + public KilogramPerSecond FC_FINAL_H => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_WHR_CORR_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_BusAux_PS_CORR_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_BusAux_ES_CORR_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_AUXHTR_KM => _fcAuxHeater / _distance; + + public KilogramPerMeter FC_AUXHTR_KM_CORR => FC_AUXHTR_KM; + + public KilogramPerMeter FC_REESS_SOC_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_REESS_SOC_CORR_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_ESS_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_ESS_CORR_KM => throw new System.NotImplementedException(); + + public KilogramPerMeter FC_FINAL_KM => throw new System.NotImplementedException(); + + public VolumePerMeter FuelVolumePerMeter => throw new System.NotImplementedException(); + + public Kilogram TotalFuelConsumptionCorrected => FC_AUXHTR_KM_CORR * _distance; + + public Joule EnergyDemand => throw new System.NotImplementedException(); + + #endregion + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/PostProcessingNinjectModule.cs b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/PostProcessingNinjectModule.cs index 512d0e4c3b7c36f0d05ee9b807812b1a84fbce76..3cf6c760745d7dea820f831775d683c0ee5da80e 100644 --- a/VectoCore/VectoCore/OutputData/ModDataPostprocessing/PostProcessingNinjectModule.cs +++ b/VectoCore/VectoCore/OutputData/ModDataPostprocessing/PostProcessingNinjectModule.cs @@ -12,7 +12,6 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing public override void Load() { - Bind<IModalDataPostProcessorFactory>().ToFactory(() => new UseFirstArgumentAsInstanceProvider()); Bind<IModalDataPostProcessor>().To<BatteryElectricPostprocessingCorrection>() @@ -35,7 +34,6 @@ namespace TUGraz.VectoCore.OutputData.ModDataPostprocessing Bind<IModalDataPostProcessor>().To<ConventionalModalDataPostprocessingCorrection>() .Named(VectoSimulationJobType.ConventionalVehicle.ToString()); - } #endregion diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs index 2a947aee113886b370e88125784f6f426525eb5a..b89bb3c4d75ffb99463e695a988d0ee42a71eac9 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs @@ -20,18 +20,20 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public XElement GetElement(IResultEntry entry, IFuelConsumptionCorrection fc) { - return new XElement(TNS + XMLNames.Report_Results_Fuel, - new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fc.Fuel.FuelType.ToXMLFormat()), - GetFuelConsumptionEntries(fc.TotalFuelConsumptionCorrected, fc.Fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount).Select(x => new XElement(TNS + XMLNames.Report_Results_FuelConsumption, x.ValueAsUnit(3, 1))) - ); + return GetElement(fc.TotalFuelConsumptionCorrected, fc.Fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount); } public XElement GetElement(IWeightedResult entry, IFuelProperties fuel, Kilogram consumption) - { - return new XElement(TNS + XMLNames.Report_Results_Fuel, - new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fuel.FuelType.ToXMLFormat()), - GetFuelConsumptionEntries(consumption, fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount).Select(x => new XElement(TNS + XMLNames.Report_Results_FuelConsumption, x.ValueAsUnit(3, 1))) - ); + { + return GetElement(consumption, fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount); + } + + protected virtual XElement GetElement(Kilogram consumption, IFuelProperties fuel, Meter distance, Kilogram payLoad, CubicMeter cargoVolume, double? passengerCount) + { + return new XElement(TNS + XMLNames.Report_Results_Fuel, + new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fuel.FuelType.ToXMLFormat()), + GetFuelConsumptionEntries(consumption, fuel, distance, payLoad, cargoVolume, passengerCount).Select(x => new XElement(TNS + XMLNames.Report_Results_FuelConsumption, x.ValueAsUnit(3, 1))) + ); } #endregion @@ -114,5 +116,4 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common #endregion } - } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs index da451d48a48d6310c9bbbe972b167b7f8ef3f07f..b506435e5cfe6e6a286269fc5b479be601095304 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs @@ -75,7 +75,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common IResultGroupWriter GetBusSimulationParameterWriter(ICommonResultsWriterFactory factory, XNamespace ns); IFuelConsumptionWriter GetFuelConsumptionBus(ICommonResultsWriterFactory factory, XNamespace ns); - IElectricEnergyConsumptionWriter GetElectricEnergyConsumptionBus(ICommonResultsWriterFactory factory, XNamespace ns); + + IElectricEnergyConsumptionWriter GetElectricEnergyConsumptionBus(ICommonResultsWriterFactory factory, XNamespace ns); ICO2Writer GetCO2ResultBus(ICommonResultsWriterFactory factory, XNamespace ns); ICO2Writer GetCO2ResultPEVBus(ICommonResultsWriterFactory factory, XNamespace ns); diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs index fb1e35a525791ecc9fc3e59a4756bd5caab7160f..caef6f1b763a04f8b9aba643aba85116ab515b04 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs @@ -16,12 +16,12 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public override XElement GetElement(IResultEntry entry) { - var fcWrtier = FuelConsumptionWriter; + var fcWriter = FuelConsumptionWriter; return new XElement(TNS + XMLNames.Report_ResultEntry_Total, VehiclePerformanceWriter.GetElement(entry), - fcWrtier != null + fcWriter != null ? entry.FuelData.Select(f => - fcWrtier.GetElement(entry, entry.FuelConsumptionFinal(f.FuelType))) + fcWriter.GetElement(entry, entry.FuelConsumptionFinal(f.FuelType))) : null, ElectricEnergyConsumptionWriter?.GetElement(entry), CO2Writer?.GetElements(entry), @@ -92,7 +92,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common protected override IResultGroupWriter VehiclePerformanceWriter => _factory.GetVehiclePerformancePEVLorry(_factory, TNS); - protected override IFuelConsumptionWriter FuelConsumptionWriter => null; + protected override IFuelConsumptionWriter FuelConsumptionWriter => null; + protected override IElectricEnergyConsumptionWriter ElectricEnergyConsumptionWriter => _factory.GetElectricEnergyConsumptionLorry(_factory, TNS); @@ -180,7 +181,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common #endregion } - + public class BusHEVNonOVCTotalWriter : NonOVCTotalWriterBase { public BusHEVNonOVCTotalWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } @@ -203,8 +204,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common #region Overrides of NonOVCTotalWriterBase protected override IResultGroupWriter VehiclePerformanceWriter => _factory.GetVehiclePerformancePEVBus(_factory, TNS); - protected override IFuelConsumptionWriter FuelConsumptionWriter => null; - + //protected override IFuelConsumptionWriter FuelConsumptionWriter => _factory.GetZEVFuelConsumptionBus(_factory, TNS); + protected override IFuelConsumptionWriter FuelConsumptionWriter => null; protected override IElectricEnergyConsumptionWriter ElectricEnergyConsumptionWriter => _factory.GetElectricEnergyConsumptionBus(_factory, TNS); protected override ICO2Writer CO2Writer => _factory.GetCO2ResultPEVBus(_factory, TNS); protected override IElectricRangeWriter ElectricRangeWriter => _factory.GetElectricRangeWriter(_factory, TNS); diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs index da90cf8a5a25aa16511c1f0967abf06304d48ecd..125bafca30fc9bad442e6d28dd487d2420eca9c6 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFResultsNinjectModule.cs @@ -1,4 +1,5 @@ -using System.Xml.Linq; +using System.Diagnostics; +using System.Xml.Linq; using Ninject.Activation; using Ninject.Extensions.Factory; using Ninject.Modules; @@ -170,7 +171,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation .NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetErrorDetailsWriter(null, XNamespace.None)); } - + [DebuggerStepThrough] private bool AccessedViaCIFResultsWriterFactory(IRequest request) { if (request.ParentRequest == null) { diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs index 30038bd8c05dfd1310d5972cc8a5254e7d241986..17be243e6490278eeabd0acabebe9d1ff897876b 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/MRFResultsNinjectModule.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Xml.Linq; using Ninject.Activation; using Ninject.Extensions.Factory; @@ -156,7 +157,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation Bind<IFuelConsumptionWriter>().To<BusFuelConsumptionWriter>().When(AccessedViaMRFResultsWriterFactory) .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetFuelConsumptionBus(null, XNamespace.None)); - Bind<IElectricEnergyConsumptionWriter>().To<BusElectricEnergyConsumptionWriter>().When(AccessedViaMRFResultsWriterFactory) + + + Bind<IElectricEnergyConsumptionWriter>().To<BusElectricEnergyConsumptionWriter>().When(AccessedViaMRFResultsWriterFactory) .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetElectricEnergyConsumptionBus(null, XNamespace.None)); Bind<ICO2Writer>().To<BusCO2Writer>().When(AccessedViaMRFResultsWriterFactory) .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetCO2ResultBus(null, XNamespace.None)); @@ -178,6 +181,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation .NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetErrorDetailsWriter(null, XNamespace.None)); } + [DebuggerStepThrough] private bool AccessedViaMRFResultsWriterFactory(IRequest request) { if (request.ParentRequest == null) { diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReport/CompletedBusManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReport/CompletedBusManufacturerReport.cs index 0a157ae8070df483054f6935e5593f9021e6a21d..f8daf58789c4bd3198af3a5e8578654d8905ae49 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReport/CompletedBusManufacturerReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReport/CompletedBusManufacturerReport.cs @@ -75,9 +75,10 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. public Meter ActualChargeDepletingRange { get; set; } public Meter EquivalentAllElectricRange { get; set; } public Meter ZeroCO2EmissionsRange { get; set; } - public IFuelProperties AuxHeaterFuel { get; } + public IFuelProperties AuxHeaterFuel { get; set; } public Kilogram ZEV_FuelConsumption_AuxHtr { get; set; } - public Kilogram ZEV_CO2 { get; } + public Kilogram ZEV_CO2 { get; set; } + public void SetResultData(VectoRunData runData, IModalDataContainer data, double weightingFactor) { throw new NotImplementedException(); @@ -253,11 +254,12 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. //Fuels result.FuelData = specificResult.FuelData; var co2Sum = 0.SI<Kilogram>(); - foreach (var fuel in specificResult.CorrectedFinalFuelConsumption.Keys) { + + foreach (var fuel in genericResult.CorrectedFinalFuelConsumption.Keys) { var fuelFactor = CalculateFactor(combinedResults, r => r.FuelConsumptionFinal(fuel).TotalFuelConsumptionCorrected); var completedFuelConsumption = - fuelFactor * (primaryResult.EnergyConsumption[fuel] * specificResult.Distance ); + fuelFactor * (primaryResult.EnergyConsumption[fuel] * specificResult.Distance); var fuelConsumption = new CompletedBusFuelConsumption() { Fuel = specificResult.FuelData.Single(f => f.FuelType == fuel), EnergyDemand = completedFuelConsumption, @@ -268,19 +270,30 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. result.CO2Total = co2Sum; - result.ElectricEnergyConsumption = null; + result.ElectricEnergyConsumption = null; if (!(primaryResult.ElectricEnergyConsumption?.IsEqual(0) ?? true)){ var electricEnergyFactor = CalculateFactor(combinedResults, r => r.ElectricEnergyConsumption); result.ElectricEnergyConsumption = electricEnergyFactor * primaryResult.ElectricEnergyConsumption * specificResult.Distance; + } - - result.ZEV_FuelConsumption_AuxHtr = -777.SI<Kilogram>(); + if (specificResult.ZEV_FuelConsumption_AuxHtr?.IsGreaterOrEqual(0) ?? false) { + result.ZEV_FuelConsumption_AuxHtr = specificResult.ZEV_FuelConsumption_AuxHtr; + var auxHeaterFuel = specificResult.AuxHeaterFuel; + + result.AuxHeaterFuel = auxHeaterFuel; + result.FuelData.Add(auxHeaterFuel); + + result.ZEV_CO2 = result.ZEV_FuelConsumption_AuxHtr * auxHeaterFuel.CO2PerFuelWeight; + } + + + if (genericResult.VectoRunData.JobType.IsOneOf(VectoSimulationJobType.BatteryElectricVehicle, VectoSimulationJobType.IEPC_E)) { @@ -290,9 +303,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. result.EquivalentAllElectricRange = elRanges.EquivalentAllElectricRange; result.ActualChargeDepletingRange = elRanges.ActualChargeDepletingRange; result.ZeroCO2EmissionsRange = elRanges.ZeroCO2EmissionsRange; - } - + } + _results.Add(result); } #endregion diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index d637e284fbdf65d722d64a435705724a899820d4..4b5fd91f5336b4c658faf616d0c4ef42427a5a4a 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -34,7 +34,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; -using System.Xml; using System.Xml.Linq; using System.Xml.XPath; using TUGraz.VectoCommon.BusAuxiliaries; @@ -230,6 +229,13 @@ namespace TUGraz.VectoCore.OutputData.XML EquivalentAllElectricRange = ranges.EquivalentAllElectricRange; ZeroCO2EmissionsRange = ranges.ZeroCO2EmissionsRange; ElectricEnergyConsumption = ranges.ElectricEnergyConsumption; + + var fc = data.CorrectedModalData.FuelCorrection.Values.FirstOrDefault(); + if (fc != null) { + ZEV_FuelConsumption_AuxHtr = fc.FC_AUXHTR_KM * Distance; + AuxHeaterFuel = fc.Fuel; + + } } if (data.HasGearbox && !runData.JobType.IsOneOf(VectoSimulationJobType.IEPC_E, VectoSimulationJobType.IEPC_S)) { diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs index 7a112c1f7b778547d427ebd4ca5cdbea1e5ebfec..f41d165c300cd1c15f9e3c7e19bdf5da11fe02da 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusSimulation.cs @@ -38,7 +38,9 @@ public class PrimaryBusSimulation private const string BASE_DIR = @"TestData\Integration\DeclarationMode\2nd_AmendmDeclMode\"; private const string BASE_DIR_COMPLETED = @"TestData\Integration\DeclarationMode\2nd_AmendmDeclMode\CompletedBus"; - private const string BASE_DIR_VIF = @"TestData\Integration\DeclarationMode\2nd_AmendmDeclMode\CompletedBus\VIF"; + + private const string BASE_DIR_FACTOR_METHOD_MODEL_DATA = @"TestData\Integration\DeclarationMode\2nd_AmendmDeclMode\CompletedBus\FactorMethod"; + private const string BASE_DIR_VIF = @"TestData\Integration\DeclarationMode\2nd_AmendmDeclMode\CompletedBus\VIF"; private ThreadLocal<StandardKernel> _kernel; private StandardKernel Kernel => _kernel.Value; @@ -178,6 +180,7 @@ public class PrimaryBusSimulation TestCase(@"PrimaryBus/P-HEV/PrimaryCityBus_P1_HEV_Supercap.xml", @"HEV_completedBus_2.xml", @"PrimaryCityBus_P1_HEV_Supercap.RSLT_VIF.xml", CycleCO, LowL, TestName = "2nd Amendment FactorMethodRunData CityBus HEV P1 SuperCap"), + ] public void TestFactorMethodRunData(string primary, string completed, string vifFile, MissionType mission, LoadingType loading) { @@ -230,6 +233,31 @@ public class PrimaryBusSimulation SerializeRunData(runsFactoryFinal, outputPath); } + + + + [TestCase()] + public void TestFactorMethodRunDataFromDedicatedFolder(string subfolder, string primary, string completed, MissionType mission, LoadingType loading, string testName) + { + + bool createVif = true; + + string vif = ""; + var testMissionFilter = GetTestMissionFilter(); + testMissionFilter.SetMissions((mission, loading)); + + + RunSimulationPrimary(primary, -1, out vif); + + + TestFactorMethodRunData(primary, completed, vif, mission, loading); + } + + public TestMissionFilter GetTestMissionFilter() + { + Kernel.Rebind<IMissionFilter>().To<TestMissionFilter>(); + return Kernel.Get<TestMissionFilter>(); + } private static void SerializeRunData(ISimulatorFactory runsFactorySingle, string outputPath) { @@ -312,7 +340,7 @@ public class PrimaryBusSimulation var runsFactory = simFactory.Factory(ExecutionMode.Declaration, dataProvider, fileWriter, null, null); - //runsFactory.WriteModalResults = true; + runsFactory.WriteModalResults = true; runsFactory.SerializeVectoRunData = true; var jobContainer = new JobContainer(new SummaryDataContainer(fileWriter)) { }; //var jobContainer = new JobContainer(new MockSumWriter()) { }; @@ -331,6 +359,10 @@ public class PrimaryBusSimulation } public void RunSimulationPrimary(string jobFile, int runIdx) + { + RunSimulationPrimary(jobFile, runIdx, out var _); + } + public void RunSimulationPrimary(string jobFile, int runIdx, out string vifFile) { var filePath = Path.Combine(BASE_DIR, jobFile); var dataProvider = _xmlReader.CreateDeclaration(filePath); @@ -370,7 +402,7 @@ public class PrimaryBusSimulation jobContainer.WaitFinished(); Assert.IsTrue(jobContainer.AllCompleted); Assert.IsTrue(jobContainer.Runs.TrueForAll(runEntry => runEntry.Success)); - + vifFile = fileWriter.XMLMultistageReportFileName; PrintRuns(jobContainer, fileWriter); PrintFiles(fileWriter); }