diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index b9ea1483e3eca735d7968eb1f47a5d4b43a21ec6..6e95bcd208f1a3112a2993e129a7203b5c471d7d 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -62,6 +62,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.OutputData.XML; using Point = TUGraz.VectoCommon.Utils.Point; +using System.Net.WebSockets; namespace TUGraz.VectoCore.Models.Declaration { @@ -1799,7 +1800,8 @@ namespace TUGraz.VectoCore.Models.Declaration UtilityFactor = D32_utilityFactor, ElectricEnergyConsumption = D36_electricEnergyConsumptionWeighted, FuelConsumption = D37_fuelConsumptionWeighted, - CO2Total = D32_utilityFactor * cdResult.CO2Total + (1 - D32_utilityFactor) * csResult.CO2Total, + + CO2PerMeter = D32_utilityFactor * (cdResult.CO2Total / cdResult.Distance) + (1 - D32_utilityFactor) * (csResult.CO2Total / csResult.Distance), AuxHeaterFuel = cdResult.AuxHeaterFuel, ZEV_CO2 = @@ -1888,7 +1890,8 @@ namespace TUGraz.VectoCore.Models.Declaration } var fuels = entries.First().FuelData; - return new WeightedResult() { + var result = new WeightedResult() + { Status = VectoRun.Status.Success, AverageSpeed = null, AverageDrivingSpeed = null, @@ -1900,8 +1903,13 @@ namespace TUGraz.VectoCore.Models.Declaration entries.All(e => e.FuelConsumptionFinal(f.FuelType) != null) ? entries.Sum(e => e.FuelConsumptionFinal(f.FuelType).TotalFuelConsumptionCorrected * e.WeightingFactor) : null)) .ToDictionary(x => x.Item1, x => x.Item2), + + FuelConsumptionPerMeter = fuels.Select(f => Tuple.Create(f, + entries.All(e => e.FuelConsumptionFinal(f.FuelType) != null) ? entries.Sum(e => + (e.FuelConsumptionFinal(f.FuelType).TotalFuelConsumptionCorrected / e.Distance) * e.WeightingFactor) : null)) + .ToDictionary(x => x.Item1, x => x.Item2), ElectricEnergyConsumption = entries.All(e => e.ElectricEnergyConsumption != null) ? entries.Sum(e => e.ElectricEnergyConsumption * e.WeightingFactor) : null, - CO2Total = entries.All(e => e.CO2Total != null) ? entries.Sum(e => e.CO2Total * e.WeightingFactor) : null, + CO2PerMeter = entries.All(e => e.CO2Total != null) ? entries.Sum(e => (e.CO2Total / e.Distance) * e.WeightingFactor) : null, ActualChargeDepletingRange = entries.All(e => e.ActualChargeDepletingRange != null) ? entries.Sum(e => e.ActualChargeDepletingRange * e.WeightingFactor) : null, EquivalentAllElectricRange = entries.All(e => e.EquivalentAllElectricRange != null) ? entries.Sum(e => e.EquivalentAllElectricRange * e.WeightingFactor) : null, ZeroCO2EmissionsRange = entries.All(e => e.ZeroCO2EmissionsRange != null) ? entries.Sum(e => e.ZeroCO2EmissionsRange * e.WeightingFactor) : null, @@ -1911,6 +1919,8 @@ namespace TUGraz.VectoCore.Models.Declaration ZEV_CO2 = entries.Sum(e => (e?.ZEV_CO2 ?? 0.SI<Kilogram>()) * e.WeightingFactor), ZEV_FuelConsumption_AuxHtr = entries.Sum(e => (e?.ZEV_FuelConsumption_AuxHtr ?? 0.SI<Kilogram>()) * e.WeightingFactor), }; + + return result; } public static IWeightedResult CalculateWeightedSummary(IList<IOVCResultEntry> entries) @@ -1924,7 +1934,8 @@ namespace TUGraz.VectoCore.Models.Declaration } var fuels = entries.First().ChargeDepletingResult.FuelData; - return new WeightedResult() { + return new WeightedResult() + { Status = VectoRun.Status.Success, AverageSpeed = null, AverageDrivingSpeed = null, @@ -1937,7 +1948,7 @@ namespace TUGraz.VectoCore.Models.Declaration e.Weighted.FuelConsumption[f] * e.ChargeDepletingResult.WeightingFactor))) .ToDictionary(x => x.Item1, x => x.Item2), ElectricEnergyConsumption = entries.Sum(e => e.Weighted.ElectricEnergyConsumption * e.ChargeDepletingResult.WeightingFactor), - CO2Total = entries.Sum(e => e.Weighted.CO2Total * e.ChargeDepletingResult.WeightingFactor), + CO2PerMeter = entries.All(e => e.Weighted.CO2PerMeter != null) ? entries.Sum(e => (e.Weighted.CO2PerMeter) * e.ChargeDepletingResult.WeightingFactor) : null, ActualChargeDepletingRange = entries.Sum(e => e.Weighted.ActualChargeDepletingRange * e.ChargeDepletingResult.WeightingFactor), EquivalentAllElectricRange = entries.Sum(e => e.Weighted.EquivalentAllElectricRange * e.ChargeDepletingResult.WeightingFactor), ZeroCO2EmissionsRange = entries.Sum(e => e.Weighted.ZeroCO2EmissionsRange * e.ChargeDepletingResult.WeightingFactor), diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 54bf1b1372635b4dbd1b5c43bae54a47b68d2581..cb903818d692694530137e858525adf62259b204 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -158,10 +158,12 @@ namespace TUGraz.VectoCore.OutputData double? PassengerCount { get; } IDictionary<IFuelProperties, Kilogram> FuelConsumption { get; } + + IDictionary<IFuelProperties, KilogramPerMeter> FuelConsumptionPerMeter { get; } WattSecond ElectricEnergyConsumption { get; } - Kilogram CO2Total { get; } + KilogramPerMeter CO2PerMeter { get; } Meter ActualChargeDepletingRange { get; } diff --git a/VectoCore/VectoCore/OutputData/OvcResultEntry.cs b/VectoCore/VectoCore/OutputData/OvcResultEntry.cs index 75c64424a79120750b001246d2af871c89b04604..e92520887534eaf823414921faa5b13cdcb4ed05 100644 --- a/VectoCore/VectoCore/OutputData/OvcResultEntry.cs +++ b/VectoCore/VectoCore/OutputData/OvcResultEntry.cs @@ -19,26 +19,42 @@ namespace TUGraz.VectoCore.OutputData public class WeightedResult : IWeightedResult { - #region Implementation of IWeightedResult public Meter Distance { get; internal set; } + public Kilogram Payload { get; internal set; } + public CubicMeter CargoVolume { get; internal set; } + public double? PassengerCount { get; internal set; } + public MeterPerSecond AverageSpeed { get; internal set; } + public MeterPerSecond AverageDrivingSpeed { get; internal set; } public IDictionary<IFuelProperties, Kilogram> FuelConsumption { get; internal set; } + + public IDictionary<IFuelProperties, KilogramPerMeter> FuelConsumptionPerMeter { get; internal set; } + public WattSecond ElectricEnergyConsumption { get; internal set; } - public Kilogram CO2Total { get; internal set; } + + public KilogramPerMeter CO2PerMeter { get; internal set; } + public Meter ActualChargeDepletingRange { get; internal set; } + public Meter EquivalentAllElectricRange { get; internal set; } + public Meter ZeroCO2EmissionsRange { get; internal set; } + public double UtilityFactor { get; internal set; } + public IFuelProperties AuxHeaterFuel { get; set; } + public Kilogram ZEV_FuelConsumption_AuxHtr { get; set; } + public Kilogram ZEV_CO2 { get; set; } + public VectoRun.Status Status { get; set; } #endregion diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs index 73fa2b5efb998027b33dd06533ca6005714aa6ca..f0714c83a0aaed7a1b348ee02fd03a10e7afd1fc 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs @@ -5,7 +5,6 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Simulation.Impl; -using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.ResultWriter; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common @@ -17,14 +16,12 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public virtual XElement[] GetElements(IResultEntry entry) { if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { - return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount) + return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount) .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, new ConvertedSI(double.NaN, x.Value.Units).ValueAsUnit())) .ToArray(); } - return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount) + return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount) .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) .ToArray(); } @@ -32,77 +29,111 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public virtual XElement[] GetElements(IWeightedResult entry) { if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { - return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount) - .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, new ConvertedSI(double.NaN, x.Value.Units).ValueAsUnit())) + return GetCO2ResultEntries(entry.CO2PerMeter, entry.Payload, entry.CargoVolume, entry.PassengerCount) + .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, + new ConvertedSI(double.NaN, x.Value.Units).ValueAsUnit())) .ToArray(); } - return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount) - .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, - x.GetElement())) + return GetCO2ResultEntries(entry.CO2PerMeter, entry.Payload, entry.CargoVolume, entry.PassengerCount) + .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) .ToArray(); } - protected abstract IList<FormattedReportValue> GetCO2ResultEntries(Kilogram co2, Meter distance, Kilogram payload, - CubicMeter volume, double? passengers); + protected abstract IList<FormattedReportValue> GetCO2ResultEntries( + Kilogram co2, + Meter distance, + Kilogram payload, + CubicMeter volume, + double? passengers); - - - } + protected abstract IList<FormattedReportValue> GetCO2ResultEntries( + KilogramPerMeter co2PerMeter, + Kilogram payload, + CubicMeter volume, + double? passengers); + } public class LorryCO2Writer : CO2WriterBase { public LorryCO2Writer(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } - - protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, - CubicMeter volume, double? passengers) + protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, CubicMeter volume, double? passengers) { var retVal = new List<FormattedReportValue>() { new FormattedReportValue((CO2Total / distance).ConvertToGrammPerKiloMeter()), new FormattedReportValue((CO2Total / distance / payload).ConvertToGrammPerTonKilometer()), }; - if (volume.IsGreater(0)) { + + if (volume.IsGreater(0)) + { retVal.Add(new FormattedReportValue((CO2Total / distance / volume).ConvertToGrammPerCubicMeterKiloMeter())); } + return retVal; } + protected override IList<FormattedReportValue> GetCO2ResultEntries(KilogramPerMeter CO2PerMeter, Kilogram payload, CubicMeter volume, double? passengers) + { + var retVal = new List<FormattedReportValue>() { + new FormattedReportValue(CO2PerMeter.ConvertToGrammPerKiloMeter()), + new FormattedReportValue((CO2PerMeter / payload).ConvertToGrammPerTonKilometer()), + }; + + if (volume.IsGreater(0)) { + retVal.Add(new FormattedReportValue((CO2PerMeter / volume).ConvertToGrammPerCubicMeterKiloMeter())); + } + + return retVal; + } } public class LorrySummaryCO2Writer : CO2WriterBase { public LorrySummaryCO2Writer(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } - - protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, - CubicMeter volume, double? passengers) + protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, CubicMeter volume, double? passengers) { - if (distance.IsEqual(0)) { + if (distance.IsEqual(0)) + { // in some testcases only a single cycle is simulated which has a weighting of 0. consider this to generate a valid report return new List<FormattedReportValue>() { new FormattedReportValue((CO2Total / 1.SI<Meter>()).ConvertToGrammPerKiloMeter()), }; } - var retVal = new List<FormattedReportValue>() { + + var retVal = new List<FormattedReportValue>() { new FormattedReportValue((CO2Total / distance).ConvertToGrammPerKiloMeter()), new FormattedReportValue((CO2Total / distance / payload).ConvertToGrammPerTonKilometer(), FormattedReportValue.Format2Decimal), }; - if (volume.IsGreater(0)) { + + if (volume.IsGreater(0)) + { retVal.Add(new FormattedReportValue((CO2Total / distance / volume).ConvertToGrammPerCubicMeterKiloMeter())); } + return retVal; } + protected override IList<FormattedReportValue> GetCO2ResultEntries(KilogramPerMeter CO2PerMeter, Kilogram payload, CubicMeter volume, double? passengers) + { + var retVal = new List<FormattedReportValue>() { + new FormattedReportValue(CO2PerMeter.ConvertToGrammPerKiloMeter()), + new FormattedReportValue((CO2PerMeter / payload).ConvertToGrammPerTonKilometer(), FormattedReportValue.Format2Decimal), + }; + + if (volume.IsGreater(0)) { + retVal.Add(new FormattedReportValue((CO2PerMeter / volume).ConvertToGrammPerCubicMeterKiloMeter())); + } + + return retVal; + } } - public class BusCO2Writer : CO2WriterBase + public class BusCO2Writer : CO2WriterBase { public BusCO2Writer(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } - protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, - CubicMeter volume, double? passengers) + protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, CubicMeter volume, double? passengers) { return new[] { new FormattedReportValue((CO2Total / distance).ConvertToGrammPerKiloMeter()), @@ -110,14 +141,21 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common }; } + protected override IList<FormattedReportValue> GetCO2ResultEntries(KilogramPerMeter CO2PerMeter, Kilogram payload, + CubicMeter volume, double? passengers) + { + return new[] { + new FormattedReportValue(CO2PerMeter.ConvertToGrammPerKiloMeter()), + new FormattedReportValue((CO2PerMeter / passengers.Value).ConvertToGrammPerPassengerKilometer()), + }; + } } public class BusSummaryCO2Writer : CO2WriterBase { public BusSummaryCO2Writer(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } - protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, - CubicMeter volume, double? passengers) + protected override IList<FormattedReportValue> GetCO2ResultEntries(Kilogram CO2Total, Meter distance, Kilogram payload, CubicMeter volume, double? passengers) { return new[] { new FormattedReportValue((CO2Total / distance).ConvertToGrammPerKiloMeter()), @@ -125,6 +163,13 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common }; } + protected override IList<FormattedReportValue> GetCO2ResultEntries(KilogramPerMeter CO2PerMeter, Kilogram payload, CubicMeter volume, double? passengers) + { + return new[] { + new FormattedReportValue(CO2PerMeter.ConvertToGrammPerKiloMeter()), + new FormattedReportValue((CO2PerMeter / passengers.Value).ConvertToGrammPerPassengerKilometer(), FormattedReportValue.Format2Decimal), + }; + } } public class BusPEVCO2Writer : BusCO2Writer @@ -140,10 +185,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common } if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { - GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount) + GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount) .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, - new ConvertedSI(double.NaN, x.Value.Units).ValueAsUnit())) + new ConvertedSI(double.NaN, x.Value.Units).ValueAsUnit())) .ToArray(); } @@ -156,9 +200,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common new XElement(TNS + XMLNames.Report_Results_FuelConsumption, new FormattedReportValue(x).GetElement())) ), new XElement(TNS + XMLNames.Report_ResultEntry_CO2ZEVAuxHeater, - GetCO2ResultEntries(entry.ZEV_CO2, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount).Select(x => - new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) + GetCO2ResultEntries(entry.ZEV_CO2, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount) + .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) ) }; } @@ -178,9 +221,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common new XElement(TNS + XMLNames.Report_Results_FuelConsumption, new FormattedReportValue(x).GetElement())) ), new XElement(TNS + XMLNames.Report_ResultEntry_CO2ZEVAuxHeater, - GetCO2ResultEntries(entry.ZEV_CO2, entry.Distance, entry.Payload, entry.CargoVolume, - entry.PassengerCount).Select(x => - new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) + GetCO2ResultEntries(entry.ZEV_CO2, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount) + .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) ) }; } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs index 078531c9766b09ce69b12083f3eb8e03682ce4d9..e588f692ed3b8b9e325c7876afee649bb16771b9 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs @@ -30,13 +30,26 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common return GetElement(fc.TotalFuelConsumptionCorrected, fc.Fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount); } - public XElement GetElement(IWeightedResult entry, IFuelProperties fuel, Kilogram consumption) + public XElement[] GetElements(IWeightedResult entry) { - if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { - return GetElementIgnore(consumption, fuel, entry.Distance, entry.Payload, - entry.CargoVolume, entry.PassengerCount); + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) + { + List<XElement> fcElementsIgnore = new List<XElement>(); + foreach (var fcEntry in entry.FuelConsumptionPerMeter) + { + fcElementsIgnore.Add(GetElementIgnore(fcEntry.Value, fcEntry.Key, entry.Payload, entry.CargoVolume, entry.PassengerCount)); + } + + return fcElementsIgnore.ToArray(); + } + + List<XElement> fcElements = new List<XElement>(); + foreach (var fcEntry in entry.FuelConsumptionPerMeter) + { + fcElements.Add(GetElement(fcEntry.Value, fcEntry.Key, entry.Payload, entry.CargoVolume, entry.PassengerCount)); } - return GetElement(consumption, fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount); + + return fcElements.ToArray(); } protected virtual XElement GetElement(Kilogram consumption, IFuelProperties fuel, Meter distance, Kilogram payLoad, CubicMeter cargoVolume, double? passengerCount) @@ -57,13 +70,43 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common new FormattedReportValue(new ConvertedSI(double.NaN, x.Units)).GetElement())) ); } - #endregion - public abstract IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, - IFuelProperties fuel, Meter distance, Kilogram payload, CubicMeter volume, + + protected virtual XElement GetElement(KilogramPerMeter consumption, IFuelProperties fuel, 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, payLoad, cargoVolume, passengerCount).Select(x => + new XElement(TNS + FCElementName, new FormattedReportValue(x).GetElement())) + ); + } + + protected virtual XElement GetElementIgnore(KilogramPerMeter consumption, IFuelProperties fuel, 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, payLoad, cargoVolume, passengerCount).Select(x => + new XElement(TNS + FCElementName, + new FormattedReportValue(new ConvertedSI(double.NaN, x.Units)).GetElement())) + ); + } + #endregion + + public abstract IList<ConvertedSI> GetFuelConsumptionEntries( + Kilogram fc, + IFuelProperties fuel, + Meter distance, + Kilogram payload, + CubicMeter volume, double? passenger); - } + public abstract IList<ConvertedSI> GetFuelConsumptionEntries( + KilogramPerMeter fcPerMeter, + IFuelProperties fuel, + Kilogram payload, + CubicMeter volume, + double? passenger); + } public class LorryFuelConsumptionWriter : FuelConsumptionWriterBase { @@ -111,8 +154,51 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common return retVal; } - #endregion - } + public override IList<ConvertedSI> GetFuelConsumptionEntries(KilogramPerMeter fcPerMeter, IFuelProperties fuel, Kilogram payload, CubicMeter volume, double? passenger) + { + if (fcPerMeter == null) + { + return new List<ConvertedSI>(); + } + + var retVal = new List<ConvertedSI> { + (fcPerMeter).ConvertToGrammPerKiloMeter(), + (fcPerMeter /payload).ConvertToGrammPerTonKilometer()}; + if (volume.IsGreater(0)) + { + retVal.Add((fcPerMeter / volume).ConvertToGrammPerCubicMeterKiloMeter()); + } + + JoulePerMeter fcPerMeterlowerHeatingValue = (fcPerMeter.Value() * fuel.LowerHeatingValueVecto.Value()).SI<JoulePerMeter>(); + retVal.AddRange(new[] { + (fcPerMeterlowerHeatingValue).ConvertToMegaJoulePerKilometer(), + (fcPerMeterlowerHeatingValue / payload).ConvertToMegaJoulePerTonKiloMeter(), + }); + + if (volume.IsGreater(0)) + { + retVal.Add((fcPerMeterlowerHeatingValue / volume).ConvertToMegaJoulePerCubicMeterKiloMeter()); + } + + if (fuel.FuelDensity != null) + { + CubicMeterPerMeter fcPerMeterDensity = (fcPerMeter.Value() / fuel.FuelDensity.Value()).SI<CubicMeterPerMeter>(); + retVal.AddRange(new[] { + (fcPerMeterDensity).ConvertToLiterPer100KiloMeter(), + (fcPerMeterDensity / payload).ConvertToLiterPerTonKiloMeter(), + }); + + if (volume.IsGreater(0)) + { + retVal.Add((fcPerMeterDensity / volume).ConvertToLiterPerCubicMeterKiloMeter()); + } + } + + return retVal; + } + + #endregion + } public class BusFuelConsumptionWriter : FuelConsumptionWriterBase { @@ -143,7 +229,31 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common return retVal; } - #endregion + public override IList<ConvertedSI> GetFuelConsumptionEntries(KilogramPerMeter fcPerMeter, IFuelProperties fuel, Kilogram payload, CubicMeter volume, double? passenger) + { + JoulePerMeter fcPerMeterLowerHeatingValue = (fcPerMeter.Value() * fuel.LowerHeatingValueVecto.Value()).SI<JoulePerMeter>(); + + var retVal = new List<ConvertedSI> { + (fcPerMeter).ConvertToGrammPerKiloMeter(), + (fcPerMeter / passenger.Value).ConvertToGrammPerPassengerKilometer(), + (fcPerMeterLowerHeatingValue).ConvertToMegaJoulePerKilometer(), + (fcPerMeterLowerHeatingValue / passenger.Value) + .ConvertToMegaJoulePerPassengerKilometer(), + }; + + if (fuel.FuelDensity != null) + { + CubicMeterPerMeter fcPerMeterDensity = (fcPerMeter.Value() / fuel.FuelDensity.Value()).SI<CubicMeterPerMeter>(); + retVal.AddRange(new[] { + (fcPerMeterDensity).ConvertToLiterPer100KiloMeter(), + (fcPerMeterDensity / passenger.Value).ConvertToLiterPerPassengerKiloMeter(), + }); + } + + return retVal; + } + + #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 166c2bc79509d06be7f6921a102a949f789f1b8b..5aff2701fc60534a03ad9878f96c1095319b24b1 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/IResultsWriter.cs @@ -112,10 +112,22 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public interface IFuelConsumptionWriter { XElement GetElement(IResultEntry entry, IFuelConsumptionCorrection fuelConsumptionCorrection); - XElement GetElement(IWeightedResult entry, IFuelProperties fuel, Kilogram consumption); + + XElement[] GetElements(IWeightedResult entry); + + IList<ConvertedSI> GetFuelConsumptionEntries( + Kilogram fc, + IFuelProperties fuel, + Meter distance, + Kilogram payload, + CubicMeter volume, + double? passenger); - IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, - IFuelProperties fuel, Meter distance, Kilogram payload, CubicMeter volume, + IList<ConvertedSI> GetFuelConsumptionEntries( + KilogramPerMeter fcPerMeter, + IFuelProperties fuel, + Kilogram payload, + CubicMeter volume, double? passenger); } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs index bbdb7028f570593bb9067ee8dd72db7baa8d5e91..4076722a29b2aaf7bbcacb5efec735cf0b527204 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs @@ -147,8 +147,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common protected override XElement[] GetFuelConsumption(IOVCResultEntry entry) { - return entry.Weighted.FuelConsumption.Select(e => - _factory.GetFuelConsumptionLorry(_factory, TNS).GetElement(entry.Weighted, e.Key, e.Value)).ToArray(); + return _factory.GetFuelConsumptionLorry(_factory, TNS).GetElements(entry.Weighted); } protected override XElement GetElectricConsumption(IOVCResultEntry entry) @@ -222,9 +221,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common protected override XElement[] GetFuelConsumption(IOVCResultEntry entry) { - return entry.Weighted.FuelConsumption.Select(e => - _factory.GetFuelConsumptionBus(_factory, TNS).GetElement(entry.Weighted, e.Key, e.Value)).ToArray(); - } + return _factory.GetFuelConsumptionBus(_factory, TNS).GetElements(entry.Weighted); + } protected override XElement GetElectricConsumption(IOVCResultEntry entry) { diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/SummaryWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/SummaryWriter.cs index eaae74f19ca799ee9356a6562c32e08520684343..3f0a30051b85e50229f766f2109e866b39a686d5 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/SummaryWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/SummaryWriter.cs @@ -39,7 +39,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation GetSummary(weighted), fcWriter != null ? weighted.FuelConsumption.Select(x => - fcWriter.GetElement(weighted, x.Key, x.Value)).ToArray() + fcWriter.GetElements(weighted)) : null, ElectricEnergyConsumptionWriter?.GetElement(weighted), CO2Writer?.GetElements(weighted), diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs index b9042b46730d91252ad2ead095e1ebf70bc1a78f..9ba378f6e14b9e690e0c9f719e9a5907baa20c3b 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/ResultGroupWriter.cs @@ -122,6 +122,13 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF }; } + public override IList<ConvertedSI> GetFuelConsumptionEntries(KilogramPerMeter fcPerMeter, IFuelProperties fuel, Kilogram payload, CubicMeter volume, double? passenger) + { + JoulePerMeter fcPerMeterlowerHeatingValue = (fcPerMeter.Value() * fuel.LowerHeatingValueVecto.Value()).SI<JoulePerMeter>(); + return new List<ConvertedSI> { + (fcPerMeterlowerHeatingValue).ConvertToMegaJoulePerKilometer(), + }; + } } public class VIFElectricEnergyConsumptionWriter : ElectricEnergyConsumptionWriterBase diff --git a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs index ad7b4414328f884cdfcd8a4f6670096475cf680f..9bc20641936cc7abe92171033c1c881eb1244784 100644 --- a/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs +++ b/VectoCore/VectoCoreTest/Reports/TestXMLResultsWriting.cs @@ -451,7 +451,7 @@ public class TestXMLResultsWriting var weighted = DeclarationData.CalculateWeightedResult(cdResult, csResult); Console.WriteLine($"{weighted.ActualChargeDepletingRange.Value().ToXMLFormat(3)} {weighted.EquivalentAllElectricRange.Value().ToXMLFormat(3)} {weighted.ZeroCO2EmissionsRange.Value().ToXMLFormat(3)} {weighted.UtilityFactor.ToXMLFormat(3)}" + - $" {weighted.ElectricEnergyConsumption.Value().ToXMLFormat(3)} {weighted.FuelConsumption[FuelData.Diesel].Value().ToXMLFormat(3)} {weighted.CO2Total.Value().ToXMLFormat(3)}"); + $" {weighted.ElectricEnergyConsumption.Value().ToXMLFormat(3)} {weighted.FuelConsumption[FuelData.Diesel].Value().ToXMLFormat(3)} {weighted.CO2PerMeter.Value().ToXMLFormat(3)}"); //1518.750 1366.875 1366.875 0.004 795230.237 30.890 20.000 @@ -461,7 +461,8 @@ public class TestXMLResultsWriting Assert.AreEqual(0.004, weighted.UtilityFactor, 1e-3); Assert.AreEqual(795230.237, weighted.ElectricEnergyConsumption.Value(), 1e-3); Assert.AreEqual(30.890, weighted.FuelConsumption[FuelData.Diesel].Value(), 1e-3); - Assert.AreEqual(20.000, weighted.CO2Total.Value(), 1e-3); + Assert.AreEqual(30000.0, weighted.Distance.Value(), 1e-3); + Assert.AreEqual(20.0/30000.0, weighted.CO2PerMeter.Value(), 1e-8); }