diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 3bc0f5f6868fa9ce3b016550b1834b0e8a0c93b0..29b2a1683d1e8ee4d5928c13cedb4dec5fafba0b 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 3856a7eda5f0740eafeda7c0a766bc59bad73f81..49c8366517e392b09b27f9305e2ff36a7f5b39d8 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 be71310a1134783df05f3dbf8392b6e29f366d27..396b303e23ee11269871b0f7dad75939b0fed331 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 79915c78f42950e55d12e30abf4f9ff24f1640bd..21a24b0fcd54c12f55003ceea4f4cfd38fab14d3 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 da39ead9342e3b49900ca64a326f6a44cfe1b664..b63b0b225857819c156ddd5e360007c260a066d6 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 cb5ab10f5ab4c147b306fec09fde821a77133cc1..70bda1d2215213b67c70ac0e38507ccbf1f39719 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 ec04e73e3f50c8b581bfdf5b8b82707b22632e6a..eea58b1522ac3d5000bce5e942f11682f9d03503 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 f9face57e24637c892b29aaf2c3daba527efdd44..a78c665bfb8ce757d0c93bd0779796cc102988df 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()