From 524cc26d34499b78879cd7c1f92c951d1075e800 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Tue, 27 Nov 2018 13:34:15 +0100 Subject: [PATCH] add weighting of results to manufacturer report --- .../DeclarationDataAdapter.cs | 1 + .../Models/Declaration/WeightingFactors.cs | 6 ++- .../Models/Declaration/WeightingGroups.cs | 4 +- .../SimulationComponent/Data/VehicleData.cs | 1 + .../OutputData/XML/XMLCustomerReport.cs | 2 +- .../OutputData/XML/XMLDeclarationReport.cs | 49 ++++++++++++++++--- .../OutputData/XML/XMLManufacturerReport.cs | 25 +++++++++- .../VectoCore/OutputData/XML/XMLVTPReport.cs | 6 +-- 8 files changed, 79 insertions(+), 15 deletions(-) diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 3bc0f5f686..29b2a1683d 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -100,6 +100,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter retVal.ManufacturerAddress = data.ManufacturerAddress; retVal.LegislativeClass = data.LegislativeClass; retVal.ZeroEmissionVehicle = data.ZeroEmissionVehicle; + retVal.SleeperCab = data.SleeperCab; retVal.TrailerGrossVehicleWeight = mission.Trailer.Sum(t => t.TrailerGrossVehicleWeight).DefaultIfNull(0); retVal.BodyAndTrailerWeight = (mission.MissionType == MissionType.MunicipalUtility diff --git a/VectoCore/VectoCore/Models/Declaration/WeightingFactors.cs b/VectoCore/VectoCore/Models/Declaration/WeightingFactors.cs index 3856a7eda5..49c8366517 100644 --- a/VectoCore/VectoCore/Models/Declaration/WeightingFactors.cs +++ b/VectoCore/VectoCore/Models/Declaration/WeightingFactors.cs @@ -14,7 +14,11 @@ namespace TUGraz.VectoCore.Models.Declaration public IDictionary<Tuple<MissionType, LoadingType>, double> Lookup(WeightingGroup group) { - return new ReadOnlyDictionary<Tuple<MissionType, LoadingType>, double>(Data[group]); + try { + return new ReadOnlyDictionary<Tuple<MissionType, LoadingType>, double>(Data[group]); + } catch (Exception e) { + throw new VectoException(ErrorMessage, e, group); + } } #region Overrides of LookupData diff --git a/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs b/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs index be71310a11..396b303e23 100644 --- a/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs +++ b/VectoCore/VectoCore/Models/Declaration/WeightingGroups.cs @@ -19,7 +19,7 @@ namespace TUGraz.VectoCore.Models.Declaration Group9LH, Group10RD, Group10LH, - Unknonw + Unknown } public class WeightingGroupHelper @@ -60,7 +60,7 @@ namespace TUGraz.VectoCore.Models.Declaration var rows = Entries.FindAll( x => x.VehicleGroup == group && x.SleeperCab == sleeperCab && engineRatedPower >= x.RatedPowerMin && engineRatedPower < x.RatedPowerMax); - return rows.Count == 0 ? WeightingGroup.Unknonw : rows.First().WeightingGroup; + return rows.Count == 0 ? WeightingGroup.Unknown : rows.First().WeightingGroup; } #endregion diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs index 79915c78f4..21a24b0fcd 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs @@ -210,6 +210,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public bool DualFuelVehicle { get; internal set; } public Watt MaxNetPower1 { get; internal set; } public Watt MaxNetPower2 { get; internal set; } + public bool SleeperCab { get; internal set; } protected void ComputeRollResistanceAndReducedMassWheels() { diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs index da39ead934..b63b0b2258 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs @@ -137,7 +137,7 @@ namespace TUGraz.VectoCore.OutputData.XML ); } - public void AddResult( + public void WriteResult( DeclarationReport<XMLDeclarationReport.ResultEntry>.ResultContainer<XMLDeclarationReport.ResultEntry> entry) { foreach (var resultEntry in entry.ResultEntry) { diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index cb5ab10f5a..70bda1d221 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -29,7 +29,9 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Text; @@ -52,6 +54,8 @@ namespace TUGraz.VectoCore.OutputData.XML private readonly IOutputDataWriter _writer; + private IDictionary<Tuple<MissionType, LoadingType>, double> _weightingFactors; + public class ResultEntry { public MeterPerSecond AverageSpeed { get; private set; } @@ -95,8 +99,10 @@ namespace TUGraz.VectoCore.OutputData.XML public PerSecond EngineSpeedDrivingAvg { get; private set; } public PerSecond EngineSpeedDrivingMax { get; private set; } + public double WeightingFactor { get; set; } + - public virtual void SetResultData(VectoRunData runData, IModalDataContainer data) + public virtual void SetResultData(VectoRunData runData, IModalDataContainer data, double weightingFactor) { FuelType = data.FuelData.FuelType; Payload = runData.VehicleData.Loading; @@ -131,15 +137,17 @@ namespace TUGraz.VectoCore.OutputData.XML FuelConsumptionTotal = data.TimeIntegral<Kilogram>(ModalResultField.FCFinal); CO2Total = FuelConsumptionTotal * data.FuelData.CO2PerFuelWeight; EnergyConsumptionTotal = FuelConsumptionTotal * data.FuelData.LowerHeatingValueVecto; + + WeightingFactor = weightingFactor; } + } public XMLDeclarationReport(IOutputDataWriter writer = null) { - _manufacturerReport = new XMLManufacturerReport(); //new XDocument(new XDeclaration("1.0", "utf-8", "yes")); + _manufacturerReport = new XMLManufacturerReport(); _customerReport = new XMLCustomerReport(); - //CustomerReport = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); - + _writer = writer; } @@ -156,14 +164,15 @@ namespace TUGraz.VectoCore.OutputData.XML protected override void DoAddResult(ResultEntry entry, VectoRunData runData, IModalDataContainer modData) { - entry.SetResultData(runData, modData); + var factor = _weightingFactors[Tuple.Create(runData.Mission.MissionType, runData.Loading)]; + entry.SetResultData(runData, modData, factor); } protected internal override void DoWriteReport() { foreach (var result in Missions.OrderBy(m => m.Key)) { - _manufacturerReport.AddResult(result.Value); - _customerReport.AddResult(result.Value); + _manufacturerReport.WriteResult(result.Value); + _customerReport.WriteResult(result.Value); } _manufacturerReport.GenerateReport(); @@ -184,10 +193,36 @@ namespace TUGraz.VectoCore.OutputData.XML public override void InitializeReport(VectoRunData modelData) { + var weightingGroup = DeclarationData.WeightingGroup.Lookup( + modelData.VehicleData.VehicleClass, modelData.VehicleData.SleeperCab, + modelData.EngineData.RatedPowerDeclared); + _weightingFactors = weightingGroup == WeightingGroup.Unknown ? ZeroWeighting : DeclarationData.WeightingFactors.Lookup(weightingGroup); _manufacturerReport.Initialize(modelData); _customerReport.Initialize(modelData); } + private static IDictionary<Tuple<MissionType, LoadingType>, double> ZeroWeighting + { + get { + return new ReadOnlyDictionary<Tuple<MissionType, LoadingType>, double>(new Dictionary<Tuple<MissionType, LoadingType>, double>() { + { Tuple.Create(MissionType.LongHaul, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.LongHaul, LoadingType.ReferenceLoad), 0}, + { Tuple.Create(MissionType.RegionalDelivery, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.RegionalDelivery, LoadingType.ReferenceLoad), 0}, + { Tuple.Create(MissionType.UrbanDelivery, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.UrbanDelivery, LoadingType.ReferenceLoad), 0}, + { Tuple.Create(MissionType.LongHaulEMS, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.LongHaulEMS, LoadingType.ReferenceLoad), 0}, + { Tuple.Create(MissionType.RegionalDeliveryEMS, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.RegionalDeliveryEMS, LoadingType.ReferenceLoad), 0}, + { Tuple.Create(MissionType.MunicipalUtility, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.MunicipalUtility, LoadingType.ReferenceLoad), 0}, + { Tuple.Create(MissionType.Construction, LoadingType.LowLoading), 0}, + { Tuple.Create(MissionType.Construction, LoadingType.ReferenceLoad), 0}, + }); + } + } + public static IEnumerable<XElement> GetResults(ResultEntry result, XNamespace tns, bool fullOutput) { diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs index ec04e73e3f..eea58b1522 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs @@ -62,8 +62,13 @@ namespace TUGraz.VectoCore.OutputData.XML protected XNamespace tns; protected XNamespace di; + private bool _allSuccess = true; + private KilogramPerMeter _weightedCo2 = 0.SI<KilogramPerMeter>(); + + private Kilogram _weightedPayload = 0.SI<Kilogram>(); + public XMLManufacturerReport() { di = "http://www.w3.org/2000/09/xmldsig#"; @@ -301,11 +306,13 @@ namespace TUGraz.VectoCore.OutputData.XML }; } - public void AddResult( + public void WriteResult( DeclarationReport<XMLDeclarationReport.ResultEntry>.ResultContainer<XMLDeclarationReport.ResultEntry> entry) { foreach (var resultEntry in entry.ResultEntry) { _allSuccess &= resultEntry.Value.Status == VectoRun.Status.Success; + _weightedPayload += resultEntry.Value.Payload * resultEntry.Value.WeightingFactor; + _weightedCo2 += resultEntry.Value.CO2Total / resultEntry.Value.Distance * resultEntry.Value.WeightingFactor; Results.Add(new XElement(tns + XMLNames.Report_Result_Result, new XAttribute(XMLNames.Report_Result_Status_Attr, resultEntry.Value.Status == VectoRun.Status.Success ? "success" : "error"), @@ -382,6 +389,21 @@ namespace TUGraz.VectoCore.OutputData.XML var retVal = new XDocument(); var results = new XElement(Results); results.AddFirst(new XElement(tns + XMLNames.Report_Result_Status, _allSuccess ? "success" : "error")); + var summary = _weightedPayload > 0 + ? new XElement( + "Summary", + new XElement( + "SpecificCO2Emissions", + new XAttribute(XMLNames.Report_Results_Unit_Attr, "gCO2/tkm"), + (_weightedCo2 / _weightedPayload).ConvertToGrammPerTonKilometer().ToXMLFormat(1) + ), + new XElement( + "AveragePayload", + new XAttribute(XMLNames.Report_Results_Unit_Attr, XMLNames.Unit_t), + _weightedPayload.ConvertToTon().ToXMLFormat(3) + ) + ) + : null; var vehicle = new XElement(VehiclePart); vehicle.Add(InputDataIntegrity); retVal.Add(new XProcessingInstruction("xml-stylesheet", "href=\"https://webgate.ec.europa.eu/CITnet/svn/VECTO/trunk/Share/XML/CSS/VectoReports.css\"")); @@ -395,6 +417,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + "Data", vehicle, results, + summary, GetApplicationInfo()) ) ); diff --git a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs index f9face57e2..a78c665bfb 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs @@ -89,9 +89,9 @@ namespace TUGraz.VectoCore.OutputData.XML #region Overrides of ResultEntry - public override void SetResultData(VectoRunData runData, IModalDataContainer data) + public override void SetResultData(VectoRunData runData, IModalDataContainer data, double factor) { - base.SetResultData(runData, data); + base.SetResultData(runData, data, factor); if (runData.SimulationType != SimulationType.VerificationTest) { return; @@ -163,7 +163,7 @@ namespace TUGraz.VectoCore.OutputData.XML protected override void DoAddResult( ResultEntry entry, VectoRunData runData, IModalDataContainer modData) { - entry.SetResultData(runData, modData); + entry.SetResultData(runData, modData, 0.0); } protected internal override void DoWriteReport() -- GitLab