diff --git a/Directory.Build.props b/Directory.Build.props index 55c7a8c28fa9c7ac9d18393c1e1eace2a9288533..7863ecbf19f737dbf6e40e47d66b994f331316b9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -5,10 +5,10 @@ <!-- <DefineConstants>RELEASE_CANDIDATE</DefineConstants> --> <!-- For a Release uncomment the following line: --> - <!-- <DefineConstants>CERTIFICATION_RELEASE</DefineConstants> --> + <DefineConstants>CERTIFICATION_RELEASE</DefineConstants> <!-- Global VECTO Version --> - <MainProductVersion>4.0.2</MainProductVersion> + <MainProductVersion>4.0.3</MainProductVersion> <!-- <VersionSuffix>RC</VersionSuffix> --> <!-- The following settings are used as default values for ALL projects --> diff --git a/Documentation/User Manual/6-changelog/changelog.md b/Documentation/User Manual/6-changelog/changelog.md index 637a4ac27da38452d0d75ba11b3409f196c8c9b7..1ae3cf8c09ce26304890bf1bd84c12311aa9ddb6 100644 --- a/Documentation/User Manual/6-changelog/changelog.md +++ b/Documentation/User Manual/6-changelog/changelog.md @@ -1,5 +1,27 @@ # Changelog +**VECTO-4.0.3** + +***Build 3330 (2024-02-13)*** + +- Bugfixes + * CodeEU-293: DistanceRun got an unexpected response + * CodeEU-298: Object reference not set to an instance of an object + * CodeEU-300: Full drive torque miscalculation + * CodeEU-336: Feature: Hashing tool must validate the previous step data for multi-step jobs + * CodeEU-337: Electric Citybus - ERROR with "31a-Specific" bus configuration + * CodeEU-343: Cannot simulate Primary Vehicle using vectocmd.exe + * CodeEU-387: VECTO sometimes fails to properly read Tyre data from primary vehicle xml + * CodeEU-427: Vehicle speed resulting to exceeding max gearbox speed + * CodeEU-428: Remove speed safety margin for gearbox re-engaging + * CodeEU-438: Mismatch XML schema vs Regulation (exempted vehicles) + * CodeEU-248: Bus P2 hybrid VECTO error in urban cycle + * CodeEU-278: Simulation crash when writing fuel consumption results to reports + * CodeEU-284: New error message and failed simulation obtained for P2 hybrid buses + * CodeEU-285: PEV vehicle error in routine to write the results with new vecto version 4.0.2.3275 + * CodeEU-287: PEV_IEPC error message:"can only operate on SI Objects with the same unit" + * CodeEU-289: VECTO Simulation Error for bus with validated input data + **VECTO-4.0.2** ***Build 3275 (2023-12-20)*** diff --git a/Documentation/User Manual/help.html b/Documentation/User Manual/help.html index df7c636f64a42ee1b1f54aef7b4cba05cd656b09..1edc0dde47dac84bdd1760e5aceebc6aea8294d4 100644 --- a/Documentation/User Manual/help.html +++ b/Documentation/User Manual/help.html @@ -10623,6 +10623,40 @@ stored as LOG_backup.txt.</p> </section> <section id="changelog" class="level1"> <h1>Changelog</h1> +<p><strong>VECTO-4.0.3</strong></p> +<p><strong><em>Build 3330 (2024-02-13)</em></strong></p> +<ul> +<li>Bugfixes +<ul> +<li>CodeEU-293: DistanceRun got an unexpected response</li> +<li>CodeEU-298: Object reference not set to an instance of an +object</li> +<li>CodeEU-300: Full drive torque miscalculation</li> +<li>CodeEU-336: Feature: Hashing tool must validate the previous step +data for multi-step jobs</li> +<li>CodeEU-337: Electric Citybus - ERROR with “31a-Specific” bus +configuration</li> +<li>CodeEU-343: Cannot simulate Primary Vehicle using vectocmd.exe</li> +<li>CodeEU-387: VECTO sometimes fails to properly read Tyre data from +primary vehicle xml</li> +<li>CodeEU-427: Vehicle speed resulting to exceeding max gearbox +speed</li> +<li>CodeEU-428: Remove speed safety margin for gearbox re-engaging</li> +<li>CodeEU-438: Mismatch XML schema vs Regulation (exempted +vehicles)</li> +<li>CodeEU-248: Bus P2 hybrid VECTO error in urban cycle</li> +<li>CodeEU-278: Simulation crash when writing fuel consumption results +to reports</li> +<li>CodeEU-284: New error message and failed simulation obtained for P2 +hybrid buses</li> +<li>CodeEU-285: PEV vehicle error in routine to write the results with +new vecto version 4.0.2.3275</li> +<li>CodeEU-287: PEV_IEPC error message:“can only operate on SI Objects +with the same unit”</li> +<li>CodeEU-289: VECTO Simulation Error for bus with validated input +data</li> +</ul></li> +</ul> <p><strong>VECTO-4.0.2</strong></p> <p><strong><em>Build 3275 (2023-12-20)</em></strong></p> <ul> diff --git a/HashingTool/Helper/HashingHelper.cs b/HashingTool/Helper/HashingHelper.cs index 9d1f1db7b722b5d5f72a256230be90b230498291..9a5c494a9d91764befaa103aa9a40c5ca85fc3a3 100644 --- a/HashingTool/Helper/HashingHelper.cs +++ b/HashingTool/Helper/HashingHelper.cs @@ -80,11 +80,18 @@ namespace HashingTool.Helper if (x == null || x.DocumentElement == null) { return null; } - var valid = x.DocumentElement.LocalName == XMLNames.VectoInputDeclaration && - x.DocumentElement.FirstChild.LocalName == XMLNames.Component_Vehicle; + var validSingleStep = (x.DocumentElement.LocalName == XMLNames.VectoInputDeclaration && + x.DocumentElement.FirstChild.LocalName == XMLNames.Component_Vehicle); + + var validMultiStep = (x.DocumentElement.LocalName == XMLNames.VectoOutputMultistep && + x.DocumentElement.FirstChild.LocalName == XMLNames.Bus_PrimaryVehicle); + + var valid = validSingleStep || validMultiStep; + if (!valid) { errorLog.LogError($"Invalid XML file given ({x.DocumentElement.LocalName}/{x.DocumentElement.FirstChild.LocalName}). " + - $"Expected Vehicle XML ({XMLNames.VectoInputDeclaration}/{XMLNames.Component_Vehicle})!"); + $"Expected Vehicle XML ({XMLNames.VectoInputDeclaration}/{XMLNames.Component_Vehicle}) or " + + $"({XMLNames.VectoOutputMultistep}/{XMLNames.Bus_PrimaryVehicle}) !"); } return valid; } diff --git a/HashingTool/ViewModel/UserControl/VectoJobFile.cs b/HashingTool/ViewModel/UserControl/VectoJobFile.cs index c8f1a7a5ada6fcd8cae74d8bf60a115b5e96d7dc..acb5c4df0bb337441b6b1bb136c368163c8aff9d 100644 --- a/HashingTool/ViewModel/UserControl/VectoJobFile.cs +++ b/HashingTool/ViewModel/UserControl/VectoJobFile.cs @@ -37,6 +37,7 @@ using System.Xml; using HashingTool.Helper; using TUGraz.VectoCommon.Hashing; using TUGraz.VectoCommon.Resources; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoHashing; using XmlDocumentType = TUGraz.VectoCore.Utils.XmlDocumentType; @@ -51,7 +52,8 @@ namespace HashingTool.ViewModel.UserControl public VectoJobFile(string name, Func<XmlDocument, IErrorLogger, bool?> contentCheck, - Action<XmlDocument, VectoXMLFile> hashValidation = null) : base(name, true, contentCheck, XmlDocumentType.DeclarationJobData, hashValidation) + Action<XmlDocument, VectoXMLFile> hashValidation = null) : + base(name, true, contentCheck, XmlDocumentType.DeclarationJobData | XmlDocumentType.MultistepOutputData, hashValidation) { _xmlFile.PropertyChanged += JobFilechanged; Components = new ObservableCollection<ComponentEntry>(); @@ -176,6 +178,13 @@ namespace HashingTool.ViewModel.UserControl entry.Component = component.Count == 1 ? component.Entry.XMLElementName() : $"{component.Entry.XMLElementName()} ({i + 1})"; + + if (entry.Component.IsOneOf(XMLNames.Bus_PrimaryVehicle, XMLNames.ManufacturingStep) + || !h.ElementIsSigned(component.Entry, i)) { + + continue; + } + entry.Valid = h.ValidateHash(component.Entry, i); entry.CanonicalizationMethod = h.GetCanonicalizationMethods(component.Entry, i).ToArray(); entry.DigestMethod = h.GetDigestMethod(component.Entry, i); diff --git a/VECTO3GUI2020/Helper/Converter/LabledTextBoxConverter.cs b/VECTO3GUI2020/Helper/Converter/LabledTextBoxConverter.cs index 5fe323ec869c2b0c5a62a3b074380494d7ae7619..8858cb9b7e4e06f0267135809fddeffcd0accd64 100644 --- a/VECTO3GUI2020/Helper/Converter/LabledTextBoxConverter.cs +++ b/VECTO3GUI2020/Helper/Converter/LabledTextBoxConverter.cs @@ -120,7 +120,7 @@ namespace VECTO3GUI2020.Helper.Converter private void GetConversionFactor(ref double factor, string convertId) { - switch (convertId.ToLower()) + switch (convertId.ToLowerInvariant()) { case "asrpm": factor = ToRpm; @@ -133,7 +133,7 @@ namespace VECTO3GUI2020.Helper.Converter private void GetDecimals(string arg, ref int? decimals) { - switch (arg.ToLower()) + switch (arg.ToLowerInvariant()) { case "int": decimals = 0; diff --git a/VECTO3GUI2020/Helper/DialogHelper.cs b/VECTO3GUI2020/Helper/DialogHelper.cs index 39162d69b8228623221234bbfc41eefa38232d31..5537e0fd0808771ce49b200fd3aa0e6e48b8a800 100644 --- a/VECTO3GUI2020/Helper/DialogHelper.cs +++ b/VECTO3GUI2020/Helper/DialogHelper.cs @@ -2,7 +2,9 @@ using System.IO; using System.Windows; using System.Windows.Forms; +using System.Windows.Threading; using VECTO3GUI2020.Properties; +using Application = System.Windows.Application; using MessageBox = System.Windows.MessageBox; namespace VECTO3GUI2020.Helper @@ -143,13 +145,23 @@ namespace VECTO3GUI2020.Helper MessageBoxButton button, MessageBoxImage icon) { - return MessageBox.Show(messageBoxText, caption, button, icon); + var t = Application.Current.Dispatcher + .InvokeAsync(() => MessageBox.Show(messageBoxText, caption, button, icon)).Task; + + t.Wait(); + return t.Result; + //return MessageBox.Show(messageBoxText, caption, button, icon); } public MessageBoxResult ShowMessageBox(string messageBoxText, string caption) { - return MessageBox.Show(messageBoxText, caption); - } + var t = Application.Current.Dispatcher + .InvokeAsync(() => MessageBox.Show(messageBoxText, caption)).Task; + + t.Wait(); + return t.Result; + //return MessageBox.Show(messageBoxText, caption); + } diff --git a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs index fdd52be745a696b4915d60d576e1aad8fc4d5122..1167ff77e0b7bf546cb67838e5b7d15472f51881 100644 --- a/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs +++ b/VECTO3GUI2020/ViewModel/Implementation/JobListViewModel.cs @@ -585,6 +585,10 @@ namespace VECTO3GUI2020.ViewModel.Implementation Type = MessageType.ErrorMessage, Message = ex.Message }); + DialogHelper.ShowErrorMessage( + $"ERROR running job {Path.GetFileName(jobEntry.DataSource.SourceFile)}: {ex.Message}", "Error"); + status.Report($"Failed to initialize Simulation"); + return; } } foreach (var cycle in jobContainer.GetCycleTypes()) diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/FilePathUtilityTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/FilePathUtilityTests.vb index 466a39eae461196032bb9ae002048616712cb4b8..7466fe2537bc84543f34375285ed72ddcfbb6104 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/FilePathUtilityTests.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/FilePathUtilityTests.vb @@ -22,7 +22,7 @@ Public Sub GetPathOnly() Dim actual As String = FilePathUtils.filePathOnly( GOODFILEPATH_WithExt) - Assert.AreEqual( expected.ToLower(), actual.ToLower()) + Assert.AreEqual( expected.ToLowerInvariant(), actual.ToLowerInvariant()) End Sub @@ -33,7 +33,7 @@ Public Sub GetExtOnly() Dim actual As String = FilePathUtils.fileExtentionOnly( GOODFILEPATH_WithExt) - Assert.AreEqual( expected.ToLower(), actual.ToLower()) + Assert.AreEqual( expected.ToLowerInvariant(), actual.ToLowerInvariant()) End Sub @@ -45,7 +45,7 @@ Public Sub NoFileNameExpectOne() Dim actual As String = FilePathUtils.fileNameOnly( noFileFILEPATH, True) - Assert.AreEqual( expected.ToLower(), actual.ToLower()) + Assert.AreEqual( expected.ToLowerInvariant(), actual.ToLowerInvariant()) End Sub diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 01b0484a6bb0d459f3a4187c7cc999c30e428754..a13a03f2ce6c6ab9885583db876952538cc05a26 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -1172,10 +1172,16 @@ namespace TUGraz.VectoCommon.InputData IList<IResult> Results { get; } } + public enum ResultStatus + { + Success, + Error, + PrimaryRunIgnored + } - public interface IResult + public interface IResult { - string ResultStatus { get; } + ResultStatus ResultStatus { get; } VehicleClass VehicleGroup { get; } diff --git a/VectoCommon/VectoHashing/VectoHash.cs b/VectoCommon/VectoHashing/VectoHash.cs index 83cd73763e1a45285fe16b9f3ea58d1f5429139b..4a371f543eccc947e73e541d794c47edfd803f01 100644 --- a/VectoCommon/VectoHashing/VectoHash.cs +++ b/VectoCommon/VectoHashing/VectoHash.cs @@ -110,11 +110,13 @@ namespace TUGraz.VectoHashing public IList<VectoComponents> GetContainigComponents() { var retVal = new List<VectoComponents>(); + var rootName = Document.FirstChild.NextSibling.LocalName; + foreach (var component in EnumHelper.GetValues<VectoComponents>()) { // special treatment for REESS: can be either supercap or multiple batteries where the component node may contain several sub-components var select = component == VectoComponents.ElectricEnergyStorage - ? $"//*[local-name()='{XMLNames.VectoInputDeclaration}']//*[local-name()='{component.XMLElementName()}' or local-name()='Capacitor']//*[local-name()='Data']" - : $"//*[local-name()='{XMLNames.VectoInputDeclaration}']//*[local-name()='{component.XMLElementName()}']"; + ? $"//*[local-name()='{rootName}']//*[local-name()='{component.XMLElementName()}' or local-name()='Capacitor']//*[local-name()='Data']" + : $"//*[local-name()='{rootName}']//*[local-name()='{component.XMLElementName()}']"; var nodes = Document.SelectNodes(select); var count = nodes?.Count ?? 0; for (var i = 0; i < count; i++) { @@ -137,7 +139,10 @@ namespace TUGraz.VectoHashing public string ComputeHash(IEnumerable<string> canonicalization = null, string digestMethod = null) { - var nodes = Document.SelectNodes(GetComponentQueryString()); + var isMultiStep = (Document.ChildNodes.Count > 0) + && Document.ChildNodes[1].ChildNodes.Cast<XmlNode>().Any(x => x.LocalName == XMLNames.ManufacturingStep); + + var nodes = Document.SelectNodes(GetComponentQueryString(null, isMultiStep)); if (nodes == null || nodes.Count == 0) { throw new Exception("No component found"); } @@ -420,12 +425,32 @@ namespace TUGraz.VectoHashing ComputeHash(component, index)); } + public bool ElementIsSigned(VectoComponents component, int index = 0) + { + var nodes = GetNodes(component, index); + + var parent = nodes[index].ParentNode; + if (parent == null) { + throw new Exception("Invalid structure of input XML!"); + } + + if (nodes[index].Attributes[XMLNames.Component_ID_Attr] == null) { + return false; + } + + var elementToHash = nodes[index].Attributes[XMLNames.Component_ID_Attr].Value; + var nodesDV = parent.SelectNodes(".//*[@URI='#" + elementToHash + "']/*[local-name() = 'DigestValue']"); + + return (nodesDV != null && nodesDV.Count > 0); + } - protected static string GetComponentQueryString(VectoComponents? component = null) + protected static string GetComponentQueryString(VectoComponents? component = null, bool isMultiStep = false) { switch (component) { case null: - return "(//*[@id])[1]"; + return isMultiStep + ? $"//*[local-name()='{XMLNames.ManufacturingStep}']/*[local-name()='Data']" + : "(//*[@id])[1]"; case VectoComponents.Vehicle: return $"//*[local-name()='{component.Value.XMLElementName()}']"; case VectoComponents.ElectricEnergyStorage: diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs index aa44a22fc0ed0fae354a66d867e0c9fc0dee9891..e65493d40983083cf05b2148f1eced60bbb0a3d2 100644 --- a/VectoCore/VectoCore/Configuration/Constants.cs +++ b/VectoCore/VectoCore/Configuration/Constants.cs @@ -374,8 +374,6 @@ namespace TUGraz.VectoCore.Configuration /// the combustion engine is set to on. /// </summary> public const double VTPIdleSpeedDetectionFactor = 0.85; - - public const double DownshiftIdlespeedFactor = 1.1; } public static class XML diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONIEPCData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONIEPCData.cs index 06cfacf087591e2e6f95cc6990946824ed91c611..a6f205d64a1817cd15438ba650cbf9eeeef7c2bd 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONIEPCData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONIEPCData.cs @@ -79,7 +79,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON foreach (var entry in VoltageLevels.OrderBy(x => x.VoltageLevel).AsEnumerable()) { var maxTq = IEPCFullLoadCurveReader.Create(entry.FullLoadCurve, count, gearRatioUsedForMeasurement.Ratio); - if (maxTq.MaxSpeed > maxPwr) { + if (maxTq.MaxPower > maxPwr) { maxPwr = maxTq.MaxPower; } } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs index 120a9a7b773e17dfe809ef5586d8beb791568f9b..4c23345405693ada1879da380d16be7ed5da9a5c 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs @@ -836,7 +836,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON _manufacturerResults = new ManufacturerResults(xmlDoc.SelectSingleNode("//*[local-name() = 'Results']")); _vehicleLenght = xmlDoc.SelectSingleNode("//*[local-name() = 'VehicleLength']")?.InnerText.ToDouble().SI<Meter>(); - _vehicleClass = VehicleClassHelper.Parse(xmlDoc.SelectSingleNode("//*[local-name() = 'VehicleGroup']").InnerText); + _vehicleClass = VehicleClassHelper.Parse(xmlDoc.SelectSingleNode("//*[local-name() = 'VehicleGroup']")?.InnerText); _vehicleCode = xmlDoc.SelectSingleNode("//*[local-name() = 'VehicleCode']")?.InnerText.ParseEnum<VehicleCode>() ?? VehicleCode.NOT_APPLICABLE; } } @@ -849,7 +849,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON Results = new List<IResult>(); foreach (XmlNode node in resultNode.SelectNodes("./*[local-name() = 'Result' and @status='success']")) { var entry = new Result { - ResultStatus = node.Attributes.GetNamedItem("status").InnerText, + ResultStatus = node.Attributes.GetNamedItem("status").InnerText.ParseEnum<ResultStatus>(), Mission = node.SelectSingleNode("./*[local-name()='Mission']").InnerText.ParseEnum<MissionType>(), SimulationParameter = GetSimulationParameter(node.SelectSingleNode("./*[local-name() = 'SimulationParameters' or local-name() = 'SimulationParametersCompletedVehicle']")), EnergyConsumption = node.SelectSingleNode("./*[local-name()='Fuel' and FuelConsumption/@unit='MJ/km']")? diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs index b7a1dec0e18faa22425e6960cc6f080d64807cf6..6b2a02a52baa432acda57a651ade60584c2fe7cd 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationPrimaryVehicleBusResultsInputDataProviderV01.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Xml; using System.Xml.Linq; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; @@ -54,7 +55,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider private IList<IResult> GetResult(XmlNode xmlNode) { - var resultStatus = GetAttribute(xmlNode, XMLNames.Result_Status); + var resultStatus = GetAttribute(xmlNode, XMLNames.Result_Status).ParseEnum<ResultStatus>(); var vehicleGroup = GetString(XMLNames.Report_Results_PrimaryVehicleSubgroup, xmlNode); var mission = GetString(XMLNames.Report_Result_Mission, xmlNode).ParseEnum<MissionType>(); var simulationNode = GetNode(XMLNames.Report_ResultEntry_SimulationParameters, xmlNode); @@ -66,9 +67,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider var retVal = new List<IResult>(); foreach (XmlNode node in ovcModes) { var ovcMode = GetAttribute(node, XMLNames.Results_Report_OVCModeAttr).ParseEnum<OvcHevMode>(); - GetEnergyConsumption(node, out var ovcEnergyConsumption, out var ovcElectricEnergyConsumption); + GetEnergyConsumption(node, out var ovcEnergyConsumption, out var ovcElectricEnergyConsumption, out var ovcIgnoredPrimaryRun); retVal.Add(new Result { - ResultStatus = resultStatus, + ResultStatus = ovcIgnoredPrimaryRun ? ResultStatus.PrimaryRunIgnored : resultStatus, Mission = mission, VehicleGroup = VehicleClassHelper.Parse(vehicleGroup), SimulationParameter = simulationParams, @@ -82,10 +83,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider return retVal; } - GetEnergyConsumption(xmlNode, out var energyConsumption, out var electricEnergyConsumption); + GetEnergyConsumption(xmlNode, out var energyConsumption, out var electricEnergyConsumption, out var ignoredPrimaryRun); return new List<IResult>() { new Result { - ResultStatus = resultStatus, + ResultStatus = ignoredPrimaryRun ? ResultStatus.PrimaryRunIgnored : resultStatus, Mission = mission, VehicleGroup = VehicleClassHelper.Parse(vehicleGroup), SimulationParameter = simulationParams, @@ -98,19 +99,37 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider } private void GetEnergyConsumption(XmlNode xmlNode, out Dictionary<FuelType, JoulePerMeter> energyConsumption, - out JoulePerMeter electricEnergyConsumption) + out JoulePerMeter electricEnergyConsumption, out bool ignoredPrimaryRun) { + var ignoredPrimaryRunTmp = false; energyConsumption = GetNodes(XMLNames.Report_Results_Fuel, xmlNode) - .Cast<XmlNode>().Select(x => new KeyValuePair<FuelType, JoulePerMeter>( - GetAttribute(x, XMLNames.Report_Results_Fuel_Type_Attr).ParseEnum<FuelType>(), - x.SelectSingleNode( - $".//*[local-name()='{XMLNames.Report_Result_EnergyConsumption}' and @unit='MJ/km']")?.InnerText - .ToDouble().SI(Unit.SI.Mega.Joule.Per.Kilo.Meter).Cast<JoulePerMeter>())).ToDictionary(x => x.Key, x => x.Value); - electricEnergyConsumption = GetNode(XMLNames.Report_ResultEntry_VIF_ElectricEnergyConsumption, xmlNode, required:false)? + .Cast<XmlNode>().Select(x => { + var fuelType = GetAttribute(x, XMLNames.Report_Results_Fuel_Type_Attr).ParseEnum<FuelType>(); + var consumption = x.SelectSingleNode( + $".//*[local-name()='{XMLNames.Report_Result_EnergyConsumption}' and @unit='MJ/km']") + ?.InnerText.ToDouble(); + if (consumption.HasValue && double.IsNaN(consumption.Value)) { + ignoredPrimaryRunTmp = true; + return new KeyValuePair<FuelType, JoulePerMeter>(fuelType, + null); + } + return new KeyValuePair<FuelType, JoulePerMeter>(fuelType, + consumption?.SI(Unit.SI.Mega.Joule.Per.Kilo.Meter).Cast<JoulePerMeter>()); + }).ToDictionary(x => x.Key, x => x.Value); + + var electricEnergyConsumptionValue = GetNode(XMLNames.Report_ResultEntry_VIF_ElectricEnergyConsumption, xmlNode, required:false)? .SelectSingleNode( $".//*[local-name()='{XMLNames.Report_Result_EnergyConsumption}' and @unit='MJ/km']")?.InnerText? - .ToDouble().SI(Unit.SI.Mega.Joule.Per.Kilo.Meter).Cast<JoulePerMeter>(); + .ToDouble(); + if (electricEnergyConsumptionValue.HasValue && double.IsNaN(electricEnergyConsumptionValue.Value)) { + ignoredPrimaryRunTmp = true; + electricEnergyConsumption = null; + } else { + electricEnergyConsumption = electricEnergyConsumptionValue?.SI(Unit.SI.Mega.Joule.Per.Kilo.Meter) + .Cast<JoulePerMeter>(); + } + ignoredPrimaryRun = ignoredPrimaryRunTmp; } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs index d2b2cf5c3ae29bfaf620603b11cfb7e75fe39722..b837673929ee14f78b9b0e580aea1154e6422e4c 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Data; +using System.Globalization; using System.IO; using System.Linq; using System.Xml; @@ -243,7 +244,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider foreach (DataRow row in corrected.Rows) { for (var i = 1; i < nrCols; i++) { var uncorr = row.ParseDouble(i); - row[i] = uncorr * dcir_corr.Value(); + row[i] = (uncorr * dcir_corr.Value()).ToXMLFormat(2); } } @@ -272,10 +273,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider var maxDischargeCurrent = maxDischargeCurrentRow.Field<string>(BatteryMaxCurrentReader.Fields.MaxDischargeCurrent).ToDouble() * 5; var newMap = new string[] { $"{BatteryMaxCurrentReader.Fields.StateOfCharge}, {BatteryMaxCurrentReader.Fields.MaxChargeCurrent}, {BatteryMaxCurrentReader.Fields.MaxDischargeCurrent}", - $" 0, {maxChargeCurrent}, 0", - $" 30, {maxChargeCurrent}, {maxDischargeCurrent}", - $" 80, {maxChargeCurrent}, {maxDischargeCurrent}", - $"100, 0, {maxDischargeCurrent}" + $" 0, {maxChargeCurrent.ToXMLFormat(2)}, 0", + $" 30, {maxChargeCurrent.ToXMLFormat(2)}, {maxDischargeCurrent.ToXMLFormat(2)}", + $" 80, {maxChargeCurrent.ToXMLFormat(2)}, {maxDischargeCurrent.ToXMLFormat(2)}", + $"100, 0, {maxDischargeCurrent.ToXMLFormat(2)}" }; return VectoCSVFile.ReadStream(newMap.Join(Environment.NewLine).ToStream()); } diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs index 25bfe50aa36dcf31cd9cbbcfc0d4c3911eefce79..9a45e004a8d751e9af0bb04cd45a38f6551c8823 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs @@ -1175,12 +1175,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl return InputComplete(_consolidateElectricConsumerData, nameof(_consolidateElectricConsumerData)) & _consolidateElectricConsumerData.IsInputDataCompleteFullCheck(jobType) & InputComplete(_consolidatedHVACBusAuxiliariesData, nameof(_consolidatedHVACBusAuxiliariesData)) - & _consolidatedHVACBusAuxiliariesData.IsInputDataCompleteFullCheck(jobType); + & ((_consolidatedHVACBusAuxiliariesData != null) + && _consolidatedHVACBusAuxiliariesData.IsInputDataCompleteFullCheck(jobType)); } return InputComplete(_consolidateElectricConsumerData, nameof(_consolidateElectricConsumerData)) && _consolidateElectricConsumerData.IsInputDataComplete(jobType) && InputComplete(_consolidatedHVACBusAuxiliariesData, nameof(_consolidatedHVACBusAuxiliariesData)) + && (_consolidatedHVACBusAuxiliariesData != null) && _consolidatedHVACBusAuxiliariesData.IsInputDataComplete(jobType); } @@ -1200,7 +1202,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl protected override IList<string> GetInvalidEntriesTemplate(VectoSimulationJobType jobType) { return _invalidEntries.Concat(_consolidateElectricConsumerData.GetInvalidEntries(jobType)) - .Concat(_consolidatedHVACBusAuxiliariesData.GetInvalidEntries(jobType)).ToList(); + .Concat(_consolidatedHVACBusAuxiliariesData?.GetInvalidEntries(jobType) ?? new List<string>()).ToList(); } @@ -1366,7 +1368,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl & InputComplete(DoubleGlazing, nameof(DoubleGlazing)) & InputComplete(AdjustableAuxiliaryHeater, nameof(AdjustableAuxiliaryHeater)) & InputComplete(SeparateAirDistributionDucts, nameof(SeparateAirDistributionDucts)) - & MethodComplete(RequiredParametersForJobType(jobType), nameof(RequiredParametersForJobType)); + & MethodComplete(RequiredParametersForJobType(jobType), "Electric Heater"); } return MethodComplete(IsCorrectSystemConfiguration(), nameof(IsCorrectSystemConfiguration)) && InputComplete(HeatPumpTypeCoolingDriverCompartment, nameof(HeatPumpTypeCoolingDriverCompartment)) @@ -1377,7 +1379,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl && InputComplete(DoubleGlazing, nameof(DoubleGlazing)) && InputComplete(AdjustableAuxiliaryHeater, nameof(AdjustableAuxiliaryHeater)) && InputComplete(SeparateAirDistributionDucts, nameof(SeparateAirDistributionDucts)) - && MethodComplete(RequiredParametersForJobType(jobType), nameof(RequiredParametersForJobType)); + && MethodComplete(RequiredParametersForJobType(jobType), "Electric Heater"); } public override string GetInvalidEntry() diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs index 6c96f28215b978360b5723b28fff1850ef39e423..0d4bd00fb5ceb451b94b11ca7f5abc42428ce8bc 100644 --- a/VectoCore/VectoCore/InputData/Impl/InputData.cs +++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs @@ -265,11 +265,12 @@ namespace TUGraz.VectoCore.InputData.Impl public IList<IResult> Results { get; internal set; } } + [DebuggerDisplay("{ResultStatus} | {VehicleGroup} {Mission} {OvcMode}")] public class Result : IResult { - public string ResultStatus { get; internal set; } + public ResultStatus ResultStatus { get; internal set; } public VehicleClass VehicleGroup { get; internal set; } public MissionType Mission { get; internal set; } public ISimulationParameter SimulationParameter { get; internal set; } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs index a39b1f745917d0a9670332624a3069b694f9048b..f3ed1383a76bdfc045c350c0071802c5c64f08d6 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs @@ -64,21 +64,32 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen gbxLimit.Add(new VehicleMaxPropulsionTorque.FullLoadEntry() { MotorSpeed = 0.RPMtoRad(), FullDriveTorque = VectoMath.Min(gearboxData.Gears[key].MaxTorque, - (em?.EfficiencyData.VoltageLevels.Last().FullLoadDriveTorque(0.RPMtoRad()) ?? 0.SI<NewtonMeter>() * ratioAdc)) + (em?.EfficiencyData.VoltageLevels.Last().FullLoadDriveTorque(0.RPMtoRad())?.Abs() ?? 0.SI<NewtonMeter>() * ratioAdc)) }); foreach (var iceEntry in engineData.FullLoadCurves[0].FullLoadEntries) { gbxLimit.Add(new VehicleMaxPropulsionTorque.FullLoadEntry() { MotorSpeed = iceEntry.EngineSpeed, FullDriveTorque = VectoMath.Min(gearboxData.Gears[key].MaxTorque, iceEntry.TorqueFullLoad + (em?.EfficiencyData.VoltageLevels.Last().FullLoadDriveTorque( - iceEntry.EngineSpeed * ratioAdc) * ratioAdc ?? 0.SI<NewtonMeter>())) + iceEntry.EngineSpeed * ratioAdc).Abs() * ratioAdc ?? 0.SI<NewtonMeter>())) }); } var bKey = isAtGearbox ? new GearshiftPosition(key, true) : new GearshiftPosition(key); if (isAtGearbox && gearboxData.Gears[key].HasTorqueConverter) { - retVal[new GearshiftPosition(key, false)] = new VehicleMaxPropulsionTorque(gbxLimit); + var limit1C = new List<VehicleMaxPropulsionTorque.FullLoadEntry>() { + new VehicleMaxPropulsionTorque.FullLoadEntry() { + MotorSpeed = 0.RPMtoRad(), + FullDriveTorque = gearboxData.Gears[key].MaxTorque + }, + new VehicleMaxPropulsionTorque.FullLoadEntry() { + MotorSpeed = engineData.FullLoadCurves[0].N95hSpeed, + FullDriveTorque = gearboxData.Gears[key].MaxTorque + } + }; + + retVal[new GearshiftPosition(key, false)] = new VehicleMaxPropulsionTorque(limit1C); } retVal[bKey] = new VehicleMaxPropulsionTorque(gbxLimit); continue; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs index 58f34697d2c75fc5293a390efee4d47b178836c9..d0894022eb9038e76ed96fad58b47d22cd33da13 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs @@ -14,7 +14,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents { - internal abstract class VehicleDataAdapter : ComponentDataAdapterBase, IVehicleDataAdapter + internal abstract class VehicleDataAdapter : ComponentDataAdapterBase, IVehicleDataAdapter { public static NewtonMeter VehMaxTorque( ITransmissionInputData gear, int numGears, @@ -205,8 +205,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen exempted.DualFuelVehicle = data.DualFuelVehicle; exempted.MaxNetPower1 = data.MaxNetPower1; return exempted; - } - } + } + } internal class PrimaryBusVehicleDataAdapter : LorryVehicleDataAdapter { @@ -216,13 +216,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen double? passengerCount, bool allowVocational) { var retVal = base.DoCreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational); - + retVal.CurbMass = mission.CurbMass; + if (mission.BusParameter.BusGroup.IsPrimaryBus() && !mission.BusParameter.CurbMassTPMLMFactor.IsNaN() && + data.GrossVehicleMassRating * mission.BusParameter.CurbMassTPMLMFactor < mission.CurbMass) { + retVal.CurbMass = data.GrossVehicleMassRating * mission.BusParameter.CurbMassTPMLMFactor; + } retVal.GrossVehicleMass = 40000.SI<Kilogram>(); return retVal; } - #endregion + #endregion protected virtual SIBase<Kilogram> CalculateElectricComponentMass(IVehicleDeclarationInputData data) { @@ -247,7 +251,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen DeclarationData.EM_MassInverter; additionalMass.Add(Tuple.Create("IEPC", VectoMath.Round(massEM, MidpointRounding.AwayFromZero))); - } + } var count = 0; foreach (var reess in data.Components.ElectricStorage.ElectricStorageElements) { @@ -262,7 +266,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return additionalMass.Sum(x => x.Item2); } - } + } internal class ExemptedPrimaryBusVehicleDataAdapter : PrimaryBusVehicleDataAdapter { @@ -303,14 +307,19 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { var retVal = base.DoCreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational); - retVal.CurbMass = mission.CurbMass + CalculateElectricComponentMass(data); + if (!mission.BusParameter.CurbMassTPMLMFactor.IsNaN() && + data.GrossVehicleMassRating * mission.BusParameter.CurbMassTPMLMFactor < mission.CurbMass) { + retVal.CurbMass = data.GrossVehicleMassRating * mission.BusParameter.CurbMassTPMLMFactor; + } else { + retVal.CurbMass = mission.CurbMass + CalculateElectricComponentMass(data); + } return retVal; } - #endregion + #endregion - } + } internal class PrimaryBusVehicleDataAdapter_PEV : PrimaryBusVehicleDataAdapter { @@ -321,16 +330,21 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { var retVal = base.DoCreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational); - retVal.CurbMass = mission.CurbMass - mission.GenericMassICE + CalculateElectricComponentMass(data); + if (!mission.BusParameter.CurbMassTPMLMFactor.IsNaN() && + data.GrossVehicleMassRating * mission.BusParameter.CurbMassTPMLMFactor < mission.CurbMass) { + retVal.CurbMass = data.GrossVehicleMassRating * mission.BusParameter.CurbMassTPMLMFactor; + } else { + retVal.CurbMass = mission.CurbMass - mission.GenericMassICE + CalculateElectricComponentMass(data); + } return retVal; } #endregion - } + } - internal class CompletedBusGenericVehicleDataAdapter : PrimaryBusVehicleDataAdapter + internal class CompletedBusGenericVehicleDataAdapter : PrimaryBusVehicleDataAdapter { #region Overrides of PrimaryBusVehicleDataAdapter @@ -339,10 +353,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { var retVal = base.DoCreateVehicleData(data, segment, mission, loading, passengerCount, allowVocational); retVal.GrossVehicleMass = data.GrossVehicleMassRating; - if (retVal.TotalVehicleMass.IsGreater(retVal.GrossVehicleMass)) - { - throw new VectoException("Total Vehicle Mass exceeds Gross Vehicle Mass for completed bus generic ({0}/{1})", retVal.TotalVehicleMass, retVal.GrossVehicleMass); - } + return retVal; } @@ -360,7 +371,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } - internal class CompletedBusSpecificVehicleDataAdapter : IVehicleDataAdapter + internal class CompletedBusSpecificVehicleDataAdapter : IVehicleDataAdapter { protected IVehicleDataAdapter completedBusGenericDataAdapter = new CompletedBusGenericVehicleDataAdapter(); @@ -373,54 +384,54 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } public virtual VehicleData CreateVehicleData(IVehicleDeclarationInputData primaryVehicle, - IVehicleDeclarationInputData completedVehicle, Segment segment, Mission mission, - KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) - { - if (completedVehicle.NumberPassengerSeatsLowerDeck == null) { - throw new VectoException("NumberOfPassengerSeatsLowerDeck input parameter is required"); - } - if (completedVehicle.NumberPassengerSeatsUpperDeck == null) { - throw new VectoException("NumberOfPassengerSeatsUpperDeck input parameter is required"); - } - if (completedVehicle.NumberPassengersStandingLowerDeck == null) { - throw new VectoException("NumberOfPassengersStandingLowerDeck input parameter is required"); - } - if (completedVehicle.NumberPassengersStandingUpperDeck == null) { - throw new VectoException("NumberOfPassengersStandingUpperDeck input parameter is required"); - } - var passengers = DeclarationData.GetNumberOfPassengers( - mission, completedVehicle.Length, completedVehicle.Width, - completedVehicle.NumberPassengerSeatsLowerDeck.Value + completedVehicle.NumberPassengerSeatsUpperDeck.Value, - completedVehicle.NumberPassengersStandingLowerDeck.Value + completedVehicle.NumberPassengersStandingUpperDeck.Value, - loading.Key); - - var vehicleData = completedBusGenericDataAdapter.CreateVehicleData(primaryVehicle, segment, mission, loading.Value.Item1, loading.Value.Item2, false); - vehicleData.InputData = completedVehicle; - vehicleData.VIN = completedVehicle.VIN; - vehicleData.LegislativeClass = completedVehicle.LegislativeClass; - vehicleData.VehicleCategory = VehicleCategory.HeavyBusCompletedVehicle; - vehicleData.Manufacturer = completedVehicle.Manufacturer; - vehicleData.ModelName = completedVehicle.Model; - vehicleData.ManufacturerAddress = completedVehicle.ManufacturerAddress; - vehicleData.CurbMass = completedVehicle.CurbMassChassis; - - vehicleData.Loading = passengers * mission.MissionType.GetAveragePassengerMass(); - vehicleData.PassengerCount = passengers; - vehicleData.GrossVehicleMass = completedVehicle.GrossVehicleMassRating; - vehicleData.DigestValueInput = completedVehicle.DigestValue?.DigestValue ?? ""; - - vehicleData.RegisteredClass = completedVehicle.RegisteredClass; - - vehicleData.VehicleCode = completedVehicle.VehicleCode; - if (vehicleData.TotalVehicleMass.IsGreater(vehicleData.GrossVehicleMass)) { - throw new VectoException("Total Vehicle Mass exceeds Gross Vehicle Mass for completed bus specific ({0}/{1})", - vehicleData.TotalVehicleMass, vehicleData.GrossVehicleMass); - } - return vehicleData; - } - - #endregion - } + IVehicleDeclarationInputData completedVehicle, Segment segment, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) + { + if (completedVehicle.NumberPassengerSeatsLowerDeck == null) { + throw new VectoException("NumberOfPassengerSeatsLowerDeck input parameter is required"); + } + if (completedVehicle.NumberPassengerSeatsUpperDeck == null) { + throw new VectoException("NumberOfPassengerSeatsUpperDeck input parameter is required"); + } + if (completedVehicle.NumberPassengersStandingLowerDeck == null) { + throw new VectoException("NumberOfPassengersStandingLowerDeck input parameter is required"); + } + if (completedVehicle.NumberPassengersStandingUpperDeck == null) { + throw new VectoException("NumberOfPassengersStandingUpperDeck input parameter is required"); + } + var passengers = DeclarationData.GetNumberOfPassengers( + mission, completedVehicle.Length, completedVehicle.Width, + completedVehicle.NumberPassengerSeatsLowerDeck.Value + completedVehicle.NumberPassengerSeatsUpperDeck.Value, + completedVehicle.NumberPassengersStandingLowerDeck.Value + completedVehicle.NumberPassengersStandingUpperDeck.Value, + loading.Key); + + var vehicleData = completedBusGenericDataAdapter.CreateVehicleData(primaryVehicle, segment, mission, loading.Value.Item1, loading.Value.Item2, false); + vehicleData.InputData = completedVehicle; + vehicleData.VIN = completedVehicle.VIN; + vehicleData.LegislativeClass = completedVehicle.LegislativeClass; + vehicleData.VehicleCategory = VehicleCategory.HeavyBusCompletedVehicle; + vehicleData.Manufacturer = completedVehicle.Manufacturer; + vehicleData.ModelName = completedVehicle.Model; + vehicleData.ManufacturerAddress = completedVehicle.ManufacturerAddress; + vehicleData.CurbMass = completedVehicle.CurbMassChassis; + + vehicleData.Loading = passengers * mission.MissionType.GetAveragePassengerMass(); + vehicleData.PassengerCount = passengers; + vehicleData.GrossVehicleMass = completedVehicle.GrossVehicleMassRating; + vehicleData.DigestValueInput = completedVehicle.DigestValue?.DigestValue ?? ""; + + vehicleData.RegisteredClass = completedVehicle.RegisteredClass; + + vehicleData.VehicleCode = completedVehicle.VehicleCode; + if (vehicleData.TotalVehicleMass.IsGreater(vehicleData.GrossVehicleMass)) { + throw new VectoException("Total Vehicle Mass exceeds Gross Vehicle Mass for completed bus specific ({0}/{1})", + vehicleData.TotalVehicleMass, vehicleData.GrossVehicleMass); + } + return vehicleData; + } + + #endregion + } internal class ExemptedCompletedBusSpecificVehicleDataAdapter : CompletedBusSpecificVehicleDataAdapter { @@ -443,11 +454,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen MaxNetPower1 = primaryVehicle.MaxNetPower1, InputData = completedVehicle }; - } + } } - internal class SingleBusVehicleDataAdapter : VehicleDataAdapter + internal class SingleBusVehicleDataAdapter : VehicleDataAdapter { #region Overrides of VehicleDataAdapter diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs index 27d8b59a5bf9f050133bfe578c9e64b06bd9d4d9..0554ca45c685cf4eacf2788161bb9ff350b899af 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs @@ -171,14 +171,20 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun var primaryResult = DataProvider.MultistageJobInputData.JobInputData.PrimaryVehicle.GetResult( simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, simulationRunData.VehicleData.Loading, ovcHevMode); - if (primaryResult == null || !primaryResult.ResultStatus.Equals("success")) { + + if (primaryResult == null) { throw new VectoException( "Failed to find results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3}. Make sure PIF and completed vehicle data match!", simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, simulationRunData.VehicleData.Loading); } - - if (primaryResult.ResultStatus != "success") { + if (primaryResult.ResultStatus == ResultStatus.PrimaryRunIgnored) { + throw new VectoException( + "The vehicle group of the complete(d) vehicle falls into a primary vehicle sub-group for which no result could be calculated due to the criterion of insufficient powertrain power. mission: {1}, fuel mode: '{2}', payload: {3}.", + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + } + if (primaryResult.ResultStatus != ResultStatus.Success) { throw new VectoException( "Simulation results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3} not finished successfully.", simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs index e20e1cad0108c9a3a55ba3460435e6ed4abd9ce7..8f3548c6d3c0d540053e8d5106e3467ba14e8ab7 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs @@ -10,6 +10,7 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies; +using TUGraz.VectoCore.Models.Declaration.PostMortemAnalysisStrategy; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -115,8 +116,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), ExecutionMode = ExecutionMode.Declaration, }; - - return simulationRunData; + simulationRunData.PostMortemStrategy = new PrimaryBusPostMortemStrategy(); + return simulationRunData; } protected abstract void CreateGearboxAndGearshiftData(VectoRunData runData); @@ -539,6 +540,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa runData.ModFileSuffix += ovcMode == OvcHevMode.ChargeSustaining ? "CS" : "CD"; } runData.OVCMode = ovcMode; + return runData; } diff --git a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs index 5ae545a4c4e34850f1c59ada12add144f46c1f3f..ff3c24c9e811b3c5a2befece7ea7834b0b02009a 100644 --- a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs @@ -185,19 +185,24 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories var primaryResult = InputDataProvider.JobInputData.PrimaryVehicle.GetResult( simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, simulationRunData.VehicleData.Loading, OvcHevMode.NotApplicable); - if (primaryResult == null || !primaryResult.ResultStatus.Equals("success")) { - throw new VectoException( - "Failed to find results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3}. Make sure PIF and completed vehicle data match!", - simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, - simulationRunData.VehicleData.Loading); - } - - if (primaryResult.ResultStatus != "success") { - throw new VectoException( - "Simulation results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3} not finished successfully.", - simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, - simulationRunData.VehicleData.Loading); - } + if (primaryResult == null) { + throw new VectoException( + "Failed to find results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3}. Make sure PIF and completed vehicle data match!", + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + } + if (primaryResult.ResultStatus == ResultStatus.PrimaryRunIgnored) { + throw new VectoException( + "The vehicle group of the complete(d) vehicle falls into a primary vehicle sub-group for which no result could be calculated due to the criterion of insufficient powertrain power. mission: {1}, fuel mode: '{2}', payload: {3}.", + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + } + if (primaryResult.ResultStatus != ResultStatus.Success) { + throw new VectoException( + "Simulation results in PrimaryVehicleReport for vehicle group: {0}, mission: {1}, fuel mode: '{2}', payload: {3} not finished successfully.", + simulationRunData.Mission.BusParameter.BusGroup, simulationRunData.Mission.MissionType, fuelMode, + simulationRunData.VehicleData.Loading); + } simulationRunData.PrimaryResult = primaryResult; diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 3ad7187ead1af3f575eb9ead0c768ecc0fe665d7..04e76a91ef8a43dceb0e6cdee1b4b5deb08d0373 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -153,11 +153,11 @@ namespace TUGraz.VectoCore.Models.Declaration /// </summary> public static Kilogram GetPayloadForGrossVehicleWeight(Kilogram grossVehicleWeight, string equationName) { - if (equationName.ToLower().StartsWith("pc10")) { + if (equationName.ToLowerInvariant().StartsWith("pc10")) { return Payloads.Lookup10Percent(grossVehicleWeight); } - if (equationName.ToLower().StartsWith("pc75")) { + if (equationName.ToLowerInvariant().StartsWith("pc75")) { return Payloads.Lookup75Percent(grossVehicleWeight); } @@ -279,8 +279,7 @@ namespace TUGraz.VectoCore.Models.Declaration case VectoSimulationJobType.BatteryElectricVehicle: case VectoSimulationJobType.IEPC_E: case VectoSimulationJobType.IEPC_S: - return (vehicleData.Components?.EngineInputData?.RatedPowerDeclared ?? 0.SI<Watt>()) + - (vehicleData.Components?.ElectricMachines?.Entries + return (vehicleData.Components?.ElectricMachines?.Entries .Where(x => x.Position != PowertrainPosition.GEN) .Sum(x => x.ElectricMachine.R85RatedPower * x.Count) ?? 0.SI<Watt>()) + (vehicleData.Components?.IEPC?.R85RatedPower ?? 0.SI<Watt>()) + @@ -1734,7 +1733,8 @@ namespace TUGraz.VectoCore.Models.Declaration VehicleOperationLookup.VehicleOperationData vehicleOperation, (double etaChgBatDepot, double etaChgBatInMission, double etaChtBatWeighted) chargingEfficiency) { - if (cdResult.Status != VectoRun.Status.Success || csResult.Status != VectoRun.Status.Success) { + if (!cdResult.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore) || + !csResult.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore)) { return null; } var batteryData = cdResult.BatteryData; @@ -1787,6 +1787,7 @@ namespace TUGraz.VectoCore.Models.Declaration .ToDictionary(x => x.Item1, x => x.Item2); var retVal = new WeightedResult() { + Status = cdResult.Status == VectoRun.Status.PrimaryBusSimulationIgnore || csResult.Status == VectoRun.Status.PrimaryBusSimulationIgnore ? VectoRun.Status.PrimaryBusSimulationIgnore : VectoRun.Status.Success, Distance = cdResult.Distance, Payload = cdResult.Payload, CargoVolume = cdResult.CargoVolume, @@ -1889,6 +1890,7 @@ namespace TUGraz.VectoCore.Models.Declaration var fuels = entries.First().FuelData; return new WeightedResult() { + Status = VectoRun.Status.Success, AverageSpeed = null, AverageDrivingSpeed = null, Distance = entries.Sum(e => e.Distance * e.WeightingFactor), @@ -1924,6 +1926,7 @@ namespace TUGraz.VectoCore.Models.Declaration var fuels = entries.First().ChargeDepletingResult.FuelData; return new WeightedResult() { + Status = VectoRun.Status.Success, AverageSpeed = null, AverageDrivingSpeed = null, Distance = entries.Sum(e => e.ChargeDepletingResult.Distance * e.ChargeDepletingResult.WeightingFactor), diff --git a/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/IIterativeRunStrategy.cs b/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/IIterativeRunStrategy.cs index 7a73c7aef5bcae95c55b7137c6b0f45f3cafafa6..24af0b7cf74b38f98bc82ab90d4119b2ea8fadb6 100644 --- a/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/IIterativeRunStrategy.cs +++ b/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/IIterativeRunStrategy.cs @@ -35,7 +35,4 @@ namespace TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies { //IIterativeRunResult CreateIterativeResult(IModalDataContainer modData); } - - - } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs index 0c2f1b7580c960ee13b5a9724dac13345424d642..75cd0f1eae59b471727126746b71dc1c2732c0a5 100644 --- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs +++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs @@ -93,7 +93,7 @@ namespace TUGraz.VectoCore.Models.Declaration protected static void NormalizeTable(DataTable table) { foreach (DataColumn col in table.Columns) { - table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLower().RemoveWhitespace(); + table.Columns[col.ColumnName].ColumnName = col.ColumnName.ToLowerInvariant().RemoveWhitespace(); } } } diff --git a/VectoCore/VectoCore/Models/Declaration/Mission.cs b/VectoCore/VectoCore/Models/Declaration/Mission.cs index e5b34736612fca4ee8fbae90dd48e2a95ae46f1a..01efa89b4b18070bebd0e8829260b15b755ac272 100644 --- a/VectoCore/VectoCore/Models/Declaration/Mission.cs +++ b/VectoCore/VectoCore/Models/Declaration/Mission.cs @@ -163,6 +163,8 @@ namespace TUGraz.VectoCore.Models.Declaration public VehicleCode? VehicleCode { get; set; } public FloorType FloorType { get; set; } public IList<BusHVACSystemConfiguration> SeparateAirDistributionDuctsHVACCfg { get; set; } + + public double CurbMassTPMLMFactor { get; set; } } public class HVACParameters diff --git a/VectoCore/VectoCore/Models/Declaration/PostMortemAnalysisStrategy/IPostMortemAnalyzeStrategy.cs b/VectoCore/VectoCore/Models/Declaration/PostMortemAnalysisStrategy/IPostMortemAnalyzeStrategy.cs new file mode 100644 index 0000000000000000000000000000000000000000..8a935a9d4948aa88c3ae8f839224e3dd7242fe8b --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/PostMortemAnalysisStrategy/IPostMortemAnalyzeStrategy.cs @@ -0,0 +1,23 @@ +using System; +using TUGraz.VectoCore.Models.Simulation; + +namespace TUGraz.VectoCore.Models.Declaration.PostMortemAnalysisStrategy +{ + + public interface IPostMortemAnalyzeStrategy + { + bool AbortSimulation(IVehicleContainer container, Exception exception); + } + + public class DefaultPostMortemAnalyzeStrategy : IPostMortemAnalyzeStrategy + { + #region Implementation of IPostMortemAnalyzeStrategy + + public bool AbortSimulation(IVehicleContainer container, Exception exception) + { + return true; + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/PostMortemAnalysisStrategy/PrimaryBusPostMortemStrategy.cs b/VectoCore/VectoCore/Models/Declaration/PostMortemAnalysisStrategy/PrimaryBusPostMortemStrategy.cs new file mode 100644 index 0000000000000000000000000000000000000000..0411b38b7cd67c55c11d97c802b7aa64c1912edc --- /dev/null +++ b/VectoCore/VectoCore/Models/Declaration/PostMortemAnalysisStrategy/PrimaryBusPostMortemStrategy.cs @@ -0,0 +1,148 @@ +using System; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Models.Declaration.PostMortemAnalysisStrategy +{ + + public class PrimaryBusPostMortemStrategy : IPostMortemAnalyzeStrategy + { + protected static readonly MeterPerSecond MinSpeed = 5.KMPHtoMeterPerSecond(); + + #region Implementation of IPostMortemAnalyzeStrategy + + public bool AbortSimulation(IVehicleContainer container, Exception exception) + { + if (container.RunData.Mission.MissionType != MissionType.Interurban) { + // for now only consider interurban cycle + return true; + } + + if (container.RunData.Loading != LoadingType.ReferenceLoad) { + // for now only consider reference load + return true; + } + + if (!container.RunData.Mission.BusParameter.DoubleDecker) { + // for now only consider double decker buses + return true; + } + if (!container.DrivingCycleInfo.RoadGradient.IsGreater(0)) { + // road gradient must be greater than 0 + return true; + } + + if (container.VehicleInfo.VehicleSpeed.IsGreater(MinSpeed)) { + // vehicle has to be almost stopped + return true; + } + + var maxGradability = GetMaxGradability(container); + if (maxGradability.IsSmaller(container.DrivingCycleInfo.RoadGradient)) { + // the vehicle cannot go this steep uphill passage... + return false; + } + return true; + } + + protected virtual Radian GetMaxGradability(IVehicleContainer container) + { + var testContainer = new SimplePowertrainContainer(container.RunData); + switch (container.PowertrainInfo.VehicleArchitecutre) { + //case VectoSimulationJobType.ConventionalVehicle: + // PowertrainBuilder.BuildSimplePowertrain(container.RunData, testContainer); + // break; + //case VectoSimulationJobType.ParallelHybridVehicle: + //case VectoSimulationJobType.IHPC: + // PowertrainBuilder.BuildSimpleHybridPowertrain(container.RunData, testContainer); + // break; + //case VectoSimulationJobType.SerialHybridVehicle: + // PowertrainBuilder.BuildSimpleSerialHybridPowertrain(container.RunData, testContainer); + // break; + //case VectoSimulationJobType.IEPC_S: + // PowertrainBuilder.BuildSimpleIEPCHybridPowertrain(container.RunData, testContainer); + // break; + case VectoSimulationJobType.BatteryElectricVehicle: + case VectoSimulationJobType.IEPC_E: + PowertrainBuilder.BuildSimplePowertrainElectric(container.RunData, testContainer); + break; + default: + throw new VectoException($"unhandled powertrain architecture {container.PowertrainInfo.VehicleArchitecutre} to calculate gradability"); + } + + testContainer.UpdateComponents(container); + + var maxSlope = SearchSlope(testContainer); + + return maxSlope; + } + + protected virtual Radian SearchSlope(SimplePowertrainContainer container) + { + var simulationInterval = Constants.SimulationSettings.TargetTimeInterval; + var absTime = 0.SI<Second>(); + var gradient = 0.SI<Radian>(); + + var vehicle = container.VehiclePort; + var acceleration = DeclarationData.GearboxTCU.StartAcceleration * 0.5; + + foreach (var motor in container.ElectricMotors.Values) { + if ((motor as ElectricMotor).Control is SimpleElectricMotorControl emCtl) { + emCtl.EmOff = false; + } + } + + if (container.HasGearbox) { + var gbx = container.GearboxCtl as Gearbox; + gbx.Gear = gbx.ModelData.GearList.First(); + } + vehicle.Initialize(0.KMPHtoMeterPerSecond(), gradient); + + var initialResponse = vehicle.Request(absTime, simulationInterval, acceleration, gradient, true); + var delta = GetDelta(initialResponse as ResponseDryRun, container.VehicleArchitecutre); + + try { + gradient = SearchAlgorithm.Search( + gradient, delta, 0.1.SI<Radian>(), + getYValue: response => GetDelta(response as ResponseDryRun, container.VehicleArchitecutre), + evaluateFunction: grad => vehicle.Request(absTime, simulationInterval, acceleration, grad, true), + criterion: response => GetDelta(response as ResponseDryRun, container.VehicleArchitecutre).Value(), + searcher: this); + } catch (VectoSearchAbortedException) { + return double.MaxValue.SI<Radian>(); + } + + return gradient; + } + + private Watt GetDelta(ResponseDryRun response, VectoSimulationJobType vehicleArchitecutre) + { + //return response.DeltaFullLoad; + + switch (vehicleArchitecutre) { + case VectoSimulationJobType.ConventionalVehicle: + case VectoSimulationJobType.ParallelHybridVehicle: + case VectoSimulationJobType.IHPC: + return response.DeltaFullLoad; + case VectoSimulationJobType.SerialHybridVehicle: + case VectoSimulationJobType.IEPC_S: + case VectoSimulationJobType.BatteryElectricVehicle: + case VectoSimulationJobType.IEPC_E: + return (response.ElectricMotor.TorqueRequest + response.ElectricMotor.MaxDriveTorque) * response.ElectricMotor.AvgDrivetrainSpeed; + default: + throw new VectoException($"unhandled powertrain architecture {vehicleArchitecutre} to calculate gradability"); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/PrimaryBusSegments.cs b/VectoCore/VectoCore/Models/Declaration/PrimaryBusSegments.cs index 896a9207e2dd03dcaf6c3505e12322bcb4a5da1a..8c664a35bf4eac84bae8cd0d334496235fb341d7 100644 --- a/VectoCore/VectoCore/Models/Declaration/PrimaryBusSegments.cs +++ b/VectoCore/VectoCore/Models/Declaration/PrimaryBusSegments.cs @@ -153,6 +153,7 @@ namespace TUGraz.VectoCore.Models.Declaration BusGroup = VehicleClassHelper.Parse(row.Field<string>("hdvgroup")), VehicleLength = row.ParseDouble("length").SI<Meter>(), VehicleWidth = row.ParseDouble("width").SI<Meter>(), + CurbMassTPMLMFactor = row.Field<string>("curbmasstpmlmfactor").ToDouble(double.NaN), BodyHeight = row.ParseDouble("bodyheight").SI<Meter>(), NumberPassengersLowerDeck = row.ParseDouble("passengerslowerdeck"), NumberPassengersUpperDeck = row.ParseDouble("passengersupperdeck"), diff --git a/VectoCore/VectoCore/Models/Declaration/SteeringPumpBus.cs b/VectoCore/VectoCore/Models/Declaration/SteeringPumpBus.cs index c65823f5d97482a4b22dfa4d01f0c2c3624b2a31..ac2f1af73f978c28d20fbbb3c818aea2a2f19fa1 100644 --- a/VectoCore/VectoCore/Models/Declaration/SteeringPumpBus.cs +++ b/VectoCore/VectoCore/Models/Declaration/SteeringPumpBus.cs @@ -101,8 +101,8 @@ namespace TUGraz.VectoCore.Models.Declaration { Data[Tuple.Create(axleNumber, mission)] = new SteeringPumpTechnologyEntry() { FullyElectric = !row.Field<string>("fullyelectric").Equals("0"), - TubingFactor = row.ParseDouble("tubing-"+mission.ToString().ToLower()), - AxleFactor = row.ParseDouble("axle-"+mission.ToString().ToLower()) + TubingFactor = row.ParseDouble("tubing-"+mission.ToString().ToLowerInvariant()), + AxleFactor = row.ParseDouble("axle-"+mission.ToString().ToLowerInvariant()) }; } } diff --git a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs index 2123c256e8d19fbd1c3f05e0eeab53d7f6b1f9ed..941537a75c99b3269f2860575a08378f6b10b7d0 100644 --- a/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs +++ b/VectoCore/VectoCore/Models/Declaration/WHTCCorrection.cs @@ -60,7 +60,7 @@ namespace TUGraz.VectoCore.Models.Declaration if (mission.IsEMS() || !mission.IsDeclarationMission() || mission == MissionType.ExemptedMission) { continue; } - var values = table.Columns[mission.ToString().ToLower()].Values<string>().ToDouble().ToArray(); + var values = table.Columns[mission.ToString().ToLowerInvariant()].Values<string>().ToDouble().ToArray(); Data[mission] = new Entry { Urban = values[0], Rural = values[1], Motorway = values[2] }; } } diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index 2d4fcb2da4a4e547e82e1118b46e51c0b3c3b61e..cee749b4e4359ac098d73730cbdb6f7aafde0e0a 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -48,6 +48,7 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; using TUGraz.VectoCore.InputData.Reader.Impl; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies; +using TUGraz.VectoCore.Models.Declaration.PostMortemAnalysisStrategy; using TUGraz.VectoCore.Models.Simulation.DataBus; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -188,6 +189,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [JsonIgnore] public IIterativeRunStrategy IterativeRunStrategy { get; internal set; } = new DefaultIterativeStrategy(); + + [JsonIgnore] + public IPostMortemAnalyzeStrategy PostMortemStrategy { get; internal set; } = new DefaultPostMortemAnalyzeStrategy(); public NewtonMeter TorqueDriftLeftWheel { get; internal set; } diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/DistanceRun.cs b/VectoCore/VectoCore/Models/Simulation/Impl/DistanceRun.cs index c128a3002df7b1992f48f540adcfe427a294e17b..229b0c07b7a717656aa63e49d0baf2339da7e8a6 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/DistanceRun.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/DistanceRun.cs @@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl { public class DistanceRun : VectoRun { - public DistanceRun(IVehicleContainer container, IFollowUpRunCreator followUpCreator) : base(container, followUpCreator) {} + public DistanceRun(IVehicleContainer container, IFollowUpRunCreator followUpCreator, IPostMortemAnalyzer postMortem) : base(container, followUpCreator, postMortem) {} public DistanceRun(IVehicleContainer container) : base(container) {} protected override IResponse DoSimulationStep() { diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PostMortemAnalyzer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PostMortemAnalyzer.cs new file mode 100644 index 0000000000000000000000000000000000000000..27a1e4038b66f777d90f427a6ba6879bca7ec1e6 --- /dev/null +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PostMortemAnalyzer.cs @@ -0,0 +1,54 @@ +using System; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCore.Models.Declaration.PostMortemAnalysisStrategy; + +namespace TUGraz.VectoCore.Models.Simulation.Impl +{ + public interface IPostMortemAnalyzer + { + /** + * @returns true if the original exception shall be thrown + */ + bool AbortSimulation(IVehicleContainer container, Exception ex); + + } + + public class NoPostMortemAnalysis : IPostMortemAnalyzer + { + #region Implementation of IPostMortemAnalyzer + + public bool AbortSimulation(IVehicleContainer container, Exception ex) + { + return true; + } + + #endregion + } + + public class DefaultPostMortemAnalyzer : IPostMortemAnalyzer + { + protected readonly IPostMortemAnalyzeStrategy _strategy; + + public DefaultPostMortemAnalyzer(IPostMortemAnalyzeStrategy postMortemStrategy) + { + _strategy = postMortemStrategy; + } + + #region Implementation of IPostMortemAnalyzer + + public bool AbortSimulation(IVehicleContainer container, Exception ex) + { + if (!_strategy.AbortSimulation(container, ex)) { + //_strategy.M + container.RunStatus = VectoRun.Status.PrimaryBusSimulationIgnore; + return false; + } + return true; + } + + #endregion + } + + + +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 0c42fe5844f49e995f1f9b8192ce481aedbc9998..50c153eacaa4fa81e474e6fa9327d31092810801 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -423,7 +423,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var dcdc = new DCDCConverter(container, data.DCDCData.DCDCEfficiency); AddHighVoltageAuxiliaries(data, container, es, dcdc); - AddHybridBusAuxiliaries(data, container, es); + AddHybridBusAuxiliaries(data, container, es, dcdc); return container; } @@ -722,7 +722,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } } - AddHighVoltageAuxiliaries(data, container, es, new DCDCConverter(container, data.DCDCData.DCDCEfficiency)); + AddHighVoltageAuxiliaries(data, container, es, dcdc); ///TODO: remove data.ElectricAuxDemand = 0.SI<Watt>(); @@ -778,8 +778,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl SetIdleControllerForHybridP1(data, gearbox, idleController, clutch); - AddHighVoltageAuxiliaries(data, container, es, new DCDCConverter(container, data.DCDCData.DCDCEfficiency)); - AddHybridBusAuxiliaries(data, container, es); + var dcdc = new DCDCConverter(container, data.DCDCData.DCDCEfficiency); + AddHighVoltageAuxiliaries(data, container, es, dcdc); + AddHybridBusAuxiliaries(data, container, es, dcdc); return container; } @@ -798,7 +799,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl return clutch; } - private static void AddHybridBusAuxiliaries(VectoRunData data, VehicleContainer container, ElectricSystem es) + private static void AddHybridBusAuxiliaries(VectoRunData data, VehicleContainer container, ElectricSystem es, + DCDCConverter dcdc) { if (data.BusAuxiliaries == null) { return; @@ -817,7 +819,6 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl busAux.ElectricStorage = electricStorage; if (data.BusAuxiliaries.ElectricalUserInputsConfig.ConnectESToREESS) { - var dcdc = new DCDCConverter(container, data.BusAuxiliaries.ElectricalUserInputsConfig.DCDCEfficiency); busAux.DCDCConverter = dcdc; es.Connect(dcdc); } @@ -1896,8 +1897,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl _timerunGearHybridBuilders[position].Invoke(data, container, components); - AddHighVoltageAuxiliaries(data, container, es, new DCDCConverter(container, data.DCDCData.DCDCEfficiency)); - AddHybridBusAuxiliaries(data, container, es); + var dcdc = new DCDCConverter(container, data.DCDCData.DCDCEfficiency); + AddHighVoltageAuxiliaries(data, container, es, dcdc); + AddHybridBusAuxiliaries(data, container, es, dcdc); } /// <summary> diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs index 336687e7cc373e19d3e2bd8ec8affdf51bf8f469..d49ef125a574ef273acff72261510d0bb773ada2 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory/SimulatorFactory.cs @@ -268,7 +268,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory var container = PowertrainBuilder.Build(data, modData, sumWriter); - run = new DistanceRun(container, new FollowUpRunCreator(data.IterativeRunStrategy)); + run = new DistanceRun(container, new FollowUpRunCreator(data.IterativeRunStrategy), new DefaultPostMortemAnalyzer(data.PostMortemStrategy)); break; case CycleType.EngineOnly: if ((data.SimulationType & SimulationType.EngineOnly) == 0) { diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs index 97d87afe0a8ff1687f1a402ee6aa2fa4dec2884f..b9580ca27fbdf19f06e19a38d9c5907c04482594 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs @@ -38,6 +38,7 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Connector.Ports; using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Declaration.PostMortemAnalysisStrategy; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Simulation.Impl @@ -52,6 +53,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl protected Second dt = 1.SI<Second>(); private bool _cancelled; private readonly IFollowUpRunCreator _followUpCreator; + private readonly IPostMortemAnalyzer _postMortemAnalyzer; protected ISimulationOutPort CyclePort { get; set; } [Required, ValidateObject] @@ -72,7 +74,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public virtual double Progress => CyclePort.Progress * (PostProcessingDone ? 1.0 : 0.99) * (WritingResultsDone ? 1.0 : 0.99); - protected VectoRun(IVehicleContainer container, IFollowUpRunCreator followUpCreator = null) + protected VectoRun(IVehicleContainer container, IFollowUpRunCreator followUpCreator = null, IPostMortemAnalyzer postMortem = null) { Container = container; RunIdentifier = Interlocked.Increment(ref _runIdCounter); @@ -81,6 +83,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl PostProcessingDone = false; WritingResultsDone = false; _followUpCreator = followUpCreator ?? new NoFollowUpRunCreator(); + _postMortemAnalyzer = postMortem ?? new NoPostMortemAnalysis(); + } [DebuggerStepThrough] public IVehicleContainer GetContainer() => Container; @@ -108,7 +112,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl Container.AbsTime = AbsTime; Initialize(); - IResponse response; + IResponse response = null; var iterationCount = 0; try { @@ -138,39 +142,62 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl PostProcessingDone = true; } catch (VectoSimulationException vse) { - Log.Error("SIMULATION RUN ABORTED! ========================"); - Log.Error(vse); - Container.RunStatus = Status.Aborted; - var ex = new VectoSimulationException("{6} ({7} {8}) - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}, f_equiv:{9}", - vse, AbsTime, Container.MileageCounter.Distance, dt, Container.VehicleInfo.VehicleSpeed, - TryCatch(() => Container.GearboxInfo.Gear), vse.Message, RunIdentifier, CycleName, RunSuffix, TryCatch(() => Container.RunData.HybridStrategyParameters?.EquivalenceFactor)); - Container.FinishSimulationRun(ex); - throw ex; - } catch (VectoException ve) { - Log.Error("SIMULATION RUN ABORTED! ========================"); - Log.Error(ve); - Container.RunStatus = Status.Aborted; - var ex = new VectoSimulationException("{6} ({7} {8}) - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}, f_equiv:{9}", - ve, AbsTime, Container.MileageCounter.Distance, dt, Container.VehicleInfo.VehicleSpeed, - TryCatch(() => Container.GearboxInfo.Gear), ve.Message, RunIdentifier, CycleName, RunSuffix, TryCatch(() => Container.RunData.HybridStrategyParameters?.EquivalenceFactor)); - try { + if (_postMortemAnalyzer?.AbortSimulation(Container, vse) ?? true) { + Log.Error("SIMULATION RUN ABORTED! ========================"); + Log.Error(vse); + Container.RunStatus = Status.Aborted; + var ex = new VectoSimulationException( + "{6} ({7} {8}) - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}, f_equiv:{9}", + vse, AbsTime, Container.MileageCounter.Distance, dt, Container.VehicleInfo.VehicleSpeed, + TryCatch(() => Container.GearboxInfo.Gear), vse.Message, RunIdentifier, CycleName, RunSuffix, + TryCatch(() => Container.RunData.HybridStrategyParameters?.EquivalenceFactor)); Container.FinishSimulationRun(ex); - } catch (Exception ve2) { - ve = new VectoException("Multiple Exceptions occured.", - new AggregateException(ve, new VectoException("Exception during finishing Simulation.", ve2))); - throw ve; + throw ex; + } + } catch (VectoException ve) { + if (_postMortemAnalyzer?.AbortSimulation(Container, ve) ?? true) { + Log.Error("SIMULATION RUN ABORTED! ========================"); + Log.Error(ve); + Container.RunStatus = Status.Aborted; + var ex = new VectoSimulationException( + "{6} ({7} {8}) - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}, f_equiv:{9}", + ve, AbsTime, Container.MileageCounter.Distance, dt, Container.VehicleInfo.VehicleSpeed, + TryCatch(() => Container.GearboxInfo.Gear), ve.Message, RunIdentifier, CycleName, RunSuffix, + TryCatch(() => Container.RunData.HybridStrategyParameters?.EquivalenceFactor)); + try { + Container.FinishSimulationRun(ex); + } catch (Exception ve2) { + ve = new VectoException("Multiple Exceptions occured.", + new AggregateException(ve, + new VectoException("Exception during finishing Simulation.", ve2))); + throw ve; + } + + throw ex; } - throw ex; } catch (Exception e) { - Log.Error("SIMULATION RUN ABORTED! ========================"); - Log.Error(e); - Container.RunStatus = Status.Aborted; - - var ex = new VectoSimulationException("{6} ({7} {8}) - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}, f_equiv:{9}", - e, AbsTime, Container.MileageCounter.Distance, dt, Container.VehicleInfo.VehicleSpeed, - TryCatch(() => Container.GearboxInfo.Gear), e.Message, RunIdentifier, CycleName, RunSuffix, TryCatch(() => Container.RunData.HybridStrategyParameters?.EquivalenceFactor) ?? "-"); - Container.FinishSimulationRun(ex); - throw ex; + if (_postMortemAnalyzer?.AbortSimulation(Container, e) ?? true) { + Log.Error("SIMULATION RUN ABORTED! ========================"); + Log.Error(e); + Container.RunStatus = Status.Aborted; + + var ex = new VectoSimulationException( + "{6} ({7} {8}) - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4} | {5}, f_equiv:{9}", + e, AbsTime, Container.MileageCounter.Distance, dt, Container.VehicleInfo.VehicleSpeed, + TryCatch(() => Container.GearboxInfo.Gear), e.Message, RunIdentifier, CycleName, RunSuffix, + TryCatch(() => Container.RunData.HybridStrategyParameters?.EquivalenceFactor) ?? "-"); + Container.FinishSimulationRun(ex); + throw ex; + } + } + + if (Container.RunStatus == Status.PrimaryBusSimulationIgnore) { + Container.FinishSimulationRun(); + WritingResultsDone = true; + FinishedWithoutErrors = true; + IterationStatistics.FinishSimulation(RunName + CycleName + RunSuffix + RunIdentifier); + Log.Info("VectoJob finished."); + return; } if (CheckCyclePortProgress()) { @@ -189,14 +216,14 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl Container = PowertrainBuilder.Build(data, Container.ModalData, Container.SumData); AbsTime = 0.SI<Second>(); Container.AbsTime = AbsTime; - CyclePort = Container.GetCycleOutPort(); + CyclePort = Container.GetCycleOutPort(); Initialize(); Run(); }, this, () => { Container.RunData.Report?.PrepareResult(null); //<- increase number of expected results; - Container.FinishSingleSimulationRun(); + Container.FinishSingleSimulationRun(); }) ?? false; if (!runAgain) { Container.FinishSimulationRun(); @@ -250,7 +277,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl Success, Canceled, Aborted, - REESSEmpty + REESSEmpty, + PrimaryBusSimulationIgnore } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs index a24a28bd079e0bc016cb49f06e253d4f302cead9..1382602db9435bcede67a7f0adc985e69babf54b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs @@ -187,9 +187,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor private NewtonMeter SearchTorqueForElectricPower(Watt batPower, PerSecond avgSpeed, NewtonMeter maxEmTorque, EfficiencyResult elPowerMaxEM, double factor = 1.0, bool forceLinesearch = false) { - var retVal = SearchAlgorithm.Search( + var delta = -maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1); + if (delta.IsEqual(0)) { + delta = 0.1.SI<NewtonMeter>(); + } + var retVal = SearchAlgorithm.Search( maxEmTorque, elPowerMaxEM.ElectricalPower - batPower, - -maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1), + delta, getYValue: x => { var myX = (EfficiencyResult)x; return (myX.ElectricalPower - batPower) * factor; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs index 9997ccf82684af4b7578404903c8b9efb8b35df5..56c67a01b4cbc1c1e20aa86d82aac46dc91a00cd 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs @@ -2,6 +2,7 @@ using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.Models.Simulation.DataBus; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Utils; @@ -58,8 +59,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { #endregion protected virtual bool CannotProvideRecuperationAtLowSpeed(NewtonMeter outTorque) - { - return (DataBus.VehicleInfo.VehicleSpeed ?? 0.SI<MeterPerSecond>()).IsSmallerOrEqual( + { + var driverIsBraking = DataBus.DriverInfo.DriverBehavior == DrivingBehavior.Braking && + DataBus.DriverInfo.DrivingAction == DrivingAction.Brake; + + return driverIsBraking && (DataBus.VehicleInfo.VehicleSpeed ?? 0.SI<MeterPerSecond>()).IsSmallerOrEqual( GearboxModelData?.DisengageWhenHaltingSpeed ?? Constants.SimulationSettings.ATGearboxDisengageWhenHaltingSpeed) && outTorque.IsSmaller(0); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index 535c20ab846f75013d8e7b6109bbb8d671159073..56d8f678afb3f41e0b532c3a3cc148c6f56434a3 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -77,12 +77,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public readonly MeterPerSecond PTODriveMinSpeed; - protected EcoRoll EcoRollState; + protected internal EcoRoll EcoRollState; protected PCCSegments PCCSegments; public PCCStates PCCState => pccState; protected internal PCCStates pccState = PCCStates.OutsideSegment; - protected bool ATEcoRollReleaseLockupClutch; + protected internal bool ATEcoRollReleaseLockupClutch; public DefaultDriverStrategy(IVehicleContainer container) { @@ -998,6 +998,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl second = Driver.DrivingActionBrake(absTime, ds, targetVelocity, gradient, first); break; case ResponseSpeedLimitExceeded _: + if (DriverStrategy.EcoRollState.State == EcoRollStates.EcoRollOn && + DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && DriverStrategy.ATEcoRollReleaseLockupClutch) { + DriverStrategy.EcoRollState.State = EcoRollStates.EcoRollOff; + DataBus.GearboxCtl.DisengageGearbox = false; + } second = Driver.DrivingActionBrake(absTime, ds, velocityWithOverspeed, gradient); debug.Add("[DMD.HRE-3] SpeedLimitExceeded->Brake", second); break; @@ -1349,11 +1354,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl debug.Add("[DMB-DB-12] Roll", response); break; case ResponseUnderload _: - if (gear.Gear != DataBus.GearboxInfo.Gear.Gear) { + if (gear.Gear != DataBus.GearboxInfo.Gear.Gear) + { // AT Gearbox switched gears, shift losses are no longer applied, try once more... response = Driver.DrivingActionAccelerate(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, gradient); debug.Add("[DMB-DB-13] Accelerate", response); + if (response is ResponseUnderload) + { + Log.Info("Brake -> Overload --> Accelerate -> Gearshift -> Accelerate --> Underload --> Accelerate --> Underload --> trying brake action"); + response = Driver.DrivingActionBrake(absTime, ds, DriverStrategy.BrakeTrigger.NextTargetSpeed, + gradient, targetDistance: targetDistance); + debug.Add("[DMB-DB-14] Brake", response); + } } break; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs index 312775c7d9987f67d346b88da9bf62e624eb7770..cd8ef7a898661ff95adc0af1375a45a4967c9cca 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs @@ -548,8 +548,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected virtual bool SpeedTooLowForEngine(GearshiftPosition gear, PerSecond outAngularSpeed) => - (outAngularSpeed * GearboxModelData.Gears[gear.Gear].Ratio).IsSmaller( - Constants.SimulationSettings.DownshiftIdlespeedFactor * DataBus.EngineInfo.EngineIdleSpeed); + (outAngularSpeed * GearboxModelData.Gears[gear.Gear].Ratio).IsSmaller(DataBus.EngineInfo.EngineIdleSpeed); protected virtual bool SpeedTooHighForEngine(GearshiftPosition gear, PerSecond outAngularSpeed) => (outAngularSpeed * GearboxModelData.Gears[gear.Gear].Ratio).IsGreaterOrEqual( diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs index e825fcab839bea6c55ce2506ef41174c6fa6e01f..94dc120c21a8c6bdee90fafee8ffaac091eb9cec 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs @@ -178,9 +178,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies var disengageTCEngineSpeedLowerIdle = braking && torqueNegative && gear1C && inAngularVelocity.IsSmallerOrEqual(DataBus.EngineInfo.EngineIdleSpeed); - if (disengageBeforeHalting || disengageTCEngineSpeedLowerIdle || disengageAngularVelocityZero || - disengageTOutNegativeAndTInPositive) { - _nextGear.SetState(absTime, disengaged: true, gear: Gears.First()); + if (disengageBeforeHalting + || disengageTCEngineSpeedLowerIdle + || disengageAngularVelocityZero + || disengageTOutNegativeAndTInPositive) + { + // In order to make it to the halting distance do not allow disengaging if propulsion from engine is needed. + bool allowDisengageGear = braking && !torqueNegative && slowerThanDisengageSpeed; + + _nextGear.SetState(absTime, disengaged: !allowDisengageGear, gear: Gears.First()); return true; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs index 0ef811c08bf8dcac342edc1d1e15a26a7625e703..9562feaf2e355615211b1aa60872fcd425382f07 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs @@ -91,7 +91,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl throw new VectoException("Powertrain with combustion engine requires gearbox and axlegear!"); //return; } - MaxVehicleSpeed = DataBus.EngineInfo.EngineN95hSpeed / + + var maxDrivetrainSpeed = VectoMath.Min( + DataBus.EngineInfo.EngineN95hSpeed, + DataBus.GearboxInfo.GetGearData(DataBus.GearboxInfo.NumGears).MaxSpeed); + + MaxVehicleSpeed = maxDrivetrainSpeed / DataBus.GearboxInfo.GetGearData(DataBus.GearboxInfo.NumGears).Ratio / DataBus.AxlegearInfo.Ratio / (DataBus.AngledriveInfo?.Ratio ?? 1.0) * @@ -119,6 +124,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ratio = DataBus.GearboxInfo.GetGearData(DataBus.GearboxInfo.NumGears).Ratio * (DataBus.AxlegearInfo?.Ratio ?? 1.0) * (DataBus.AngledriveInfo?.Ratio ?? 1.0); + + maxEMSpeed = VectoMath.Min( + DataBus.ElectricMotorInfo(pos).MaxSpeed, + DataBus.GearboxInfo.GetGearData(DataBus.GearboxInfo.NumGears).MaxSpeed); } MaxVehicleSpeed = maxEMSpeed / ratio * DataBus.WheelsInfo.DynamicTyreRadius * 0.995; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index 79d7da9d2505641752547aabbb3dcc4de5c095fe..b38f3efa60699abd1a39658c9a6d9348f79df29b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -1477,7 +1477,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies if (newEval.Count > 0) { var newBest = DoSelectBestOption(newEval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear); - if (!newBest.IgnoreReason.EngineSpeedTooHigh()) { + if ((newBest != null) && !newBest.IgnoreReason.EngineSpeedTooHigh()) { best = newBest; } } @@ -1520,8 +1520,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } } - best.SimulationInterval = dt; - best.ProhibitGearshift = prohibitGearshift; + if (best != null) { + best.SimulationInterval = dt; + best.ProhibitGearshift = prohibitGearshift; + } + return best; } @@ -2244,7 +2247,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies SetBatteryCosts(resp, dt, tmp); var absTime = DataBus.AbsTime; // todo! - if (DataBus.GearboxInfo.GearEngaged(absTime)) { + if (resp.Gearbox.Gear.Engaged) { if (iceOff) { // no torque from ICE requested, ICE could be turned off diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 96196f038d61f1ee1bc076a18dcd94d16fd5aae7..54bf1b1372635b4dbd1b5c43bae54a47b68d2581 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -143,7 +143,9 @@ namespace TUGraz.VectoCore.OutputData public interface IWeightedResult { - MeterPerSecond AverageSpeed { get; } + VectoRun.Status Status { get; } + + MeterPerSecond AverageSpeed { get; } MeterPerSecond AverageDrivingSpeed { get; } diff --git a/VectoCore/VectoCore/OutputData/OvcResultEntry.cs b/VectoCore/VectoCore/OutputData/OvcResultEntry.cs index 463dbdfe1c6284e6bc6550215d9f1153b4bb96e9..75c64424a79120750b001246d2af871c89b04604 100644 --- a/VectoCore/VectoCore/OutputData/OvcResultEntry.cs +++ b/VectoCore/VectoCore/OutputData/OvcResultEntry.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Simulation.Impl; namespace TUGraz.VectoCore.OutputData { @@ -38,6 +39,7 @@ namespace TUGraz.VectoCore.OutputData 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/SumDataFields.cs b/VectoCore/VectoCore/OutputData/SumDataFields.cs index 2d6e1d1a00effd59f89911a5282935746061e332..9711283be4adaec22ec0792968fcde858fd6d15b 100644 --- a/VectoCore/VectoCore/OutputData/SumDataFields.cs +++ b/VectoCore/VectoCore/OutputData/SumDataFields.cs @@ -746,11 +746,11 @@ namespace TUGraz.VectoCore.OutputData { E_IEPC_OFF_Loss_Format, (r, m, em) => m.ElectricMotorOffLosses(em).ConvertToKiloWattHour() }, { E_IEPC_LOSS_FORMAT, (r, m, em) => m.ElectricMotorLosses(em).ConvertToKiloWattHour() }, { E_IEPC_OFF_TIME_SHARE, (r, m, em) => (ConvertedSI)m.ElectricMotorOffTimeShare(em) }, - { EM_RATED_POWER, (r, m, em) => r.VehicleData.InputData.Components.IEPC.TotalRatedPowerCalculated.ConvertToKiloWatt() }, - { EM_RATED_SPEED_HI, (r, m, em) => r.VehicleData.InputData.Components.IEPC.VoltageLevels.MaxBy(v => v.VoltageLevel)?.ContinuousTorqueSpeed.AsRPM ?? 0 }, - { EM_RATED_SPEED_LO, (r, m, em) => r.VehicleData.InputData.Components.IEPC.VoltageLevels.MinBy(v => v.VoltageLevel)?.ContinuousTorqueSpeed.AsRPM ?? 0 }, - { EM_RATED_TORQUE_HI, (r, m, em) => (ConvertedSI)(r.VehicleData.InputData.Components.IEPC.VoltageLevels.MaxBy(v => v.VoltageLevel)?.ContinuousTorque ?? 0.SI<NewtonMeter>()) }, - { EM_RATED_TORQUE_LO, (r, m, em) => (ConvertedSI)(r.VehicleData.InputData.Components.IEPC.VoltageLevels.MinBy(v => v.VoltageLevel)?.ContinuousTorque ?? 0.SI<NewtonMeter>()) }, + { EM_RATED_POWER, (r, m, em) => r.VehicleData.InputData.Components.IEPC?.TotalRatedPowerCalculated.ConvertToKiloWatt() ?? 0.SI<Watt>().ConvertToKiloWatt() }, + { EM_RATED_SPEED_HI, (r, m, em) => r.VehicleData.InputData.Components.IEPC?.VoltageLevels.MaxBy(v => v.VoltageLevel)?.ContinuousTorqueSpeed.AsRPM ?? 0 }, + { EM_RATED_SPEED_LO, (r, m, em) => r.VehicleData.InputData.Components.IEPC?.VoltageLevels.MinBy(v => v.VoltageLevel)?.ContinuousTorqueSpeed.AsRPM ?? 0 }, + { EM_RATED_TORQUE_HI, (r, m, em) => (ConvertedSI)(r.VehicleData.InputData.Components.IEPC?.VoltageLevels.MaxBy(v => v.VoltageLevel)?.ContinuousTorque ?? 0.SI<NewtonMeter>()) }, + { EM_RATED_TORQUE_LO, (r, m, em) => (ConvertedSI)(r.VehicleData.InputData.Components.IEPC?.VoltageLevels.MinBy(v => v.VoltageLevel)?.ContinuousTorque ?? 0.SI<NewtonMeter>()) }, }; public static readonly WriteAuxEntry AuxDataValue = (r, m, a) => m.AuxiliaryWork(a).ConvertToKiloWattHour(); diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/AbstractResultsWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/AbstractResultsWriter.cs index 8836194dbafb5b9210967bb4d7bb6f02e7ef3f96..fc5c2bd548f1207361a19af5c6b3d8ac107d8fab 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/AbstractResultsWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/AbstractResultsWriter.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Xml.Linq; using TUGraz.VectoCommon.Exceptions; @@ -19,26 +20,44 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public virtual XElement GenerateResults(List<IResultEntry> results) { var ordered = GetOrderedResults(results); - var allSuccess = results.All(x => x.Status == VectoRun.Status.Success); + var allSuccess = results.All(x => x.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore)); return new XElement(TNS + XMLNames.Report_Results, new XElement(TNS + XMLNames.Report_Result_Status, allSuccess ? XMLNames.Report_Results_Status_Success_Val : XMLNames.Report_Results_Status_Error_Val), - ordered.Select(x => - x.Status == VectoRun.Status.Success - ? ResultSuccessWriter.GetElement(x) - : ResultErrorWriter.GetElement(x)), + ordered.Select(x => GetResultWriter(x.Status).GetElement(x)), allSuccess ? SummaryWriter.GetElement(ordered) : null ); } #endregion + protected virtual IResultGroupWriter GetResultWriter(VectoRun.Status status) + { + switch (status) { + case VectoRun.Status.Pending: + case VectoRun.Status.Running: + case VectoRun.Status.REESSEmpty: + throw new VectoException($"No result Writer available for run status ${status}"); + case VectoRun.Status.Success: + return ResultSuccessWriter; + case VectoRun.Status.Canceled: + case VectoRun.Status.Aborted: + return ResultErrorWriter; + case VectoRun.Status.PrimaryBusSimulationIgnore: + return ResultSuccessWriter; + default: + throw new ArgumentOutOfRangeException(nameof(status), status, null); + } + } + protected abstract XNamespace TNS { get; } protected abstract IResultGroupWriter ResultSuccessWriter { get; } protected abstract IResultGroupWriter ResultErrorWriter { get; } + //protected abstract IResultGroupWriter ResultIgnoreWriter { get; } + public abstract IReportResultsSummaryWriter SummaryWriter { get; } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs index f43ffc60a0f59c5222a9f35e22b3162eeece3da1..73fa2b5efb998027b33dd06533ca6005714aa6ca 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/CO2Writer.cs @@ -4,6 +4,7 @@ using System.Xml.Linq; 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; @@ -15,6 +16,13 @@ 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) + .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())) @@ -23,9 +31,17 @@ 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())) + .ToArray(); + } + return GetCO2ResultEntries(entry.CO2Total, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount) - .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, x.GetElement())) + .Select(x => new XElement(TNS + XMLNames.Report_Results_CO2, + x.GetElement())) .ToArray(); } @@ -123,6 +139,14 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common return null; } + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + 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(); + } + var tmp = _factory.GetFuelConsumptionBus(_factory, TNS); return new[] { new XElement(TNS + XMLNames.Report_ResultEntry_FCZEVAuxHeater, diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs index 0d067d86a943040231943578b2c462af3aa5cb93..c78ab35eece1f41ea6063c9e21760f31cb4e95d7 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ElectricEnergyWriter.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Xml.Linq; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common @@ -16,7 +17,17 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public virtual XElement GetElement(IResultEntry entry) { - return new XElement(TNS + ElectricEnergyConsumptionXMLElementName, + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new XElement(TNS + ElectricEnergyConsumptionXMLElementName, + GetEnergyConsumption(entry.ElectricEnergyConsumption, entry.Distance, entry.Payload, + entry.CargoVolume, + entry.PassengerCount).Select(x => + new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, + new FormattedReportValue(new ConvertedSI(double.NaN, x.Units)).GetElement())) + ); + } + + return new XElement(TNS + ElectricEnergyConsumptionXMLElementName, GetEnergyConsumption(entry.ElectricEnergyConsumption, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount).Select(x => new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, new FormattedReportValue(x).GetElement())) @@ -25,6 +36,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public virtual XElement GetElement(IWeightedResult weighted) { + if (weighted.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new XElement(TNS + ElectricEnergyConsumptionXMLElementName, + GetEnergyConsumption(weighted.ElectricEnergyConsumption, weighted.Distance, weighted.Payload, + weighted.CargoVolume, + weighted.PassengerCount).Select(x => + new XElement(TNS + XMLNames.Report_Result_EnergyConsumption, + new FormattedReportValue(new ConvertedSI(double.NaN, x.Units)).GetElement())) + ); + } return new XElement(TNS + ElectricEnergyConsumptionXMLElementName, GetEnergyConsumption(weighted.ElectricEnergyConsumption, weighted.Distance, weighted.Payload, weighted.CargoVolume, weighted.PassengerCount).Select(x => diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs index 84df92e8ce8b27c74359fdd4d22cd18420be0dff..078531c9766b09ce69b12083f3eb8e03682ce4d9 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/FuelConsumptionWriter.cs @@ -6,6 +6,7 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.OutputData.ModDataPostprocessing; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.ResultWriter; using TUGraz.VectoCore.Utils; @@ -16,16 +17,26 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common { protected FuelConsumptionWriterBase(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } + protected virtual string FCElementName { get; } = XMLNames.Report_Results_FuelConsumption; + #region Implementation of IFuelConsumptionWriter public XElement GetElement(IResultEntry entry, IFuelConsumptionCorrection fc) { + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return GetElementIgnore(fc.TotalFuelConsumptionCorrected, fc.Fuel, entry.Distance, entry.Payload, + entry.CargoVolume, entry.PassengerCount); + } return GetElement(fc.TotalFuelConsumptionCorrected, fc.Fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount); } public XElement GetElement(IWeightedResult entry, IFuelProperties fuel, Kilogram consumption) { - return GetElement(consumption, fuel, entry.Distance, entry.Payload, entry.CargoVolume, entry.PassengerCount); + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return GetElementIgnore(consumption, fuel, entry.Distance, entry.Payload, + entry.CargoVolume, entry.PassengerCount); + } + 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) @@ -33,13 +44,22 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common 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, new FormattedReportValue(x).GetElement())) + new XElement(TNS + FCElementName, new FormattedReportValue(x).GetElement())) ); } + protected virtual XElement GetElementIgnore(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 + FCElementName, + new FormattedReportValue(new ConvertedSI(double.NaN, x.Units)).GetElement())) + ); + } #endregion - public abstract IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, + public abstract IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, IFuelProperties fuel, Meter distance, Kilogram payload, CubicMeter volume, double? passenger); @@ -58,6 +78,11 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common // 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<ConvertedSI>() { (fc / 1.SI<Meter>()).ConvertToGrammPerKiloMeter(),}; } + + if (fc == null) { + return new List<ConvertedSI>(); + } + var retVal = new List<ConvertedSI> { (fc / distance).ConvertToGrammPerKiloMeter(), (fc / distance /payload).ConvertToGrammPerTonKilometer()}; diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs index cab35597bef17e8a5a2f6057078ed595344f253e..fee1a52dc737834422e412d32c32aa2f930107ef 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultGroupWriter.cs @@ -93,6 +93,16 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public XElement[] GetElements(IResultEntry result) { + if (result.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new[] { + new XElement(TNS + XMLNames.Report_ResultEntry_ActualChargeDepletingRange, + new ConvertedSI(double.NaN, XMLNames.Unit_km).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_EquivalentAllElectricRange, + new ConvertedSI(double.NaN, XMLNames.Unit_km).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_ZeroCO2EmissionsRange, + new ConvertedSI(double.NaN, XMLNames.Unit_km).ValueAsUnit()), + }; + } return new[] { new XElement(TNS + XMLNames.Report_ResultEntry_ActualChargeDepletingRange, result.ActualChargeDepletingRange.ConvertToKiloMeter().ValueAsUnit()), @@ -105,7 +115,17 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public XElement[] GetElements(IWeightedResult weightedResult) { - return new[] { + if (weightedResult.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new[] { + new XElement(TNS + XMLNames.Report_ResultEntry_ActualChargeDepletingRange, + new ConvertedSI(double.NaN, XMLNames.Unit_km).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_EquivalentAllElectricRange, + new ConvertedSI(double.NaN, XMLNames.Unit_km).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_ZeroCO2EmissionsRange, + new ConvertedSI(double.NaN, XMLNames.Unit_km).ValueAsUnit()), + }; + } + return new[] { new XElement(TNS + XMLNames.Report_ResultEntry_ActualChargeDepletingRange, weightedResult.ActualChargeDepletingRange.ConvertToKiloMeter().ValueAsUnit()), new XElement(TNS + XMLNames.Report_ResultEntry_EquivalentAllElectricRange, diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs index caef6f1b763a04f8b9aba643aba85116ab515b04..bbdb7028f570593bb9067ee8dd72db7baa8d5e91 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultTotalWriter.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Xml.Linq; 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; @@ -124,7 +125,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common GetElectricConsumption(entry), GetCO2(entry), _factory.GetElectricRangeWriter(_factory, TNS).GetElements(total), - new XElement(TNS + "UtilityFactor", total.UtilityFactor.ToXMLFormat(3)) + new XElement(TNS + "UtilityFactor", entry.Weighted.Status == VectoRun.Status.PrimaryBusSimulationIgnore ? double.NaN.ToString() : total.UtilityFactor.ToXMLFormat(3)) ); } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriter.cs index 117a0414124adb5b689dd376cf46be607bc2c556..e92d932ae9220c0b104e6aa448e9cc1096b4a0bd 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/Common/ResultWriter.cs @@ -54,10 +54,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common public override XElement GetElement(IResultEntry entry) { - - - - return new XElement(TNS + XMLNames.Report_Result_Result, + return new XElement(TNS + XMLNames.Report_Result_Result, new XAttribute(XMLNames.Report_Result_Status_Attr, XMLNames.Report_Results_Status_Success_Val), new XAttribute(xsi + XMLNames.XSIType, ResultXMLType), _factory.GetSuccessMissionWriter(_factory, TNS).GetElement(entry), 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 0db9dff451e457c36a3da0e3b607ce30ef3add2b..31403ea977faa8ff3009ec08654c9105f3663bcc 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 @@ -124,8 +124,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation .NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetBusPEVSuccessResultWriter(null, XNamespace.None)); Bind<IResultGroupWriter>().To<ErrorResultWriter>().When(AccessedViaCIFResultsWriterFactory) .NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetBusErrorResultWriter(null, XNamespace.None)); - - Bind<IResultGroupWriter>().To<ResultSimulationParameterCIFBusWriter>().When(AccessedViaCIFResultsWriterFactory) + + Bind<IResultGroupWriter>().To<ResultSimulationParameterCIFBusWriter>().When(AccessedViaCIFResultsWriterFactory) .NamedLikeFactoryMethod((ICIFResultsWriterFactory c) => c.GetBusSimulationParameterWriter(null, XNamespace.None)); Bind<IResultGroupWriter>().To<BusConvTotalWriter>().When(AccessedViaCIFResultsWriterFactory) diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/CIFResultWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/CIFResultWriter.cs index ef734e12be800eb9fe6ac5308287f7ef78c6e44a..eaa8787471cd02d451ec9267e95ef363d6c9cdc1 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/CIFResultWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/ResultWriter/CIFResultWriter.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Xml.Linq; using TUGraz.VectoCommon.Resources; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common; @@ -34,10 +35,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation #region Overrides of AbstractResultsWriter protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetLorryConvSuccessResultWriter(_cifFactory, TNS); - protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetLorryErrorResultWriter(_cifFactory, TNS); - - public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryConvSummaryWriter(_cifFactory, TNS); + + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryConvSummaryWriter(_cifFactory, TNS); #endregion } @@ -48,8 +48,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetLorryHEVNonOVCSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetLorryErrorResultWriter(_cifFactory, TNS); - - public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryHEVNonOVCSummaryWriter(_cifFactory, TNS); + + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryHEVNonOVCSummaryWriter(_cifFactory, TNS); } @@ -62,7 +62,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation public override XElement GenerateResults(List<IResultEntry> results) { var ordered = GetOrderedResultsOVC(results); - var allSuccess = results.All(x => x.Status == VectoRun.Status.Success); + var allSuccess = results.All(x => x.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore) ); return new XElement(TNS + XMLNames.Report_Results, new XElement(TNS + XMLNames.Report_Result_Status, allSuccess ? XMLNames.Report_Results_Status_Success_Val : XMLNames.Report_Results_Status_Error_Val), @@ -79,7 +79,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetLorryHEVOVCSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetLorryErrorResultWriter(_cifFactory, TNS); - public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryHEVOVCSummaryWriter(_cifFactory, TNS); + + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryHEVOVCSummaryWriter(_cifFactory, TNS); } @@ -89,8 +90,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetLorryPEVSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetLorryErrorResultWriter(_cifFactory, TNS); - - public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryPEVSummaryWriter(_cifFactory, TNS); + + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetLorryPEVSummaryWriter(_cifFactory, TNS); } @@ -100,6 +101,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetBusConvSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetBusErrorResultWriter(_cifFactory, TNS); + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetBusConvSummaryWriter(_cifFactory, TNS); } @@ -110,6 +112,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetBusHEVNonOVCSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetLorryErrorResultWriter(_cifFactory, TNS); + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetBusHEVNonOVCSummaryWriter(_cifFactory, TNS); } @@ -121,7 +124,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation public override XElement GenerateResults(List<IResultEntry> results) { var ordered = GetOrderedResultsOVC(results); - var allSuccess = results.All(x => x.Status == VectoRun.Status.Success); + var allSuccess = results.All(x => x.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore)); return new XElement(TNS + XMLNames.Report_Results, new XElement(TNS + XMLNames.Report_Result_Status, allSuccess @@ -138,6 +141,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetBusHEVOVCSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetBusErrorResultWriter(_cifFactory, TNS); + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetBusHEVOVCSummaryWriter(_cifFactory, TNS); } @@ -148,6 +152,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _cifFactory.GetBusPEVSuccessResultWriter(_cifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _cifFactory.GetBusErrorResultWriter(_cifFactory, TNS); + public override Common.IReportResultsSummaryWriter SummaryWriter => _cifFactory.GetBusPEVSummaryWriter(_cifFactory, TNS); } @@ -167,6 +172,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => null; protected override IResultGroupWriter ResultErrorWriter => null; + public override Common.IReportResultsSummaryWriter SummaryWriter => 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 9528fd23fbc51ded34cab9d9f2d292ecc00e6b75..57cb9b37ee3c57ac59b3a16ca9052e100393ec40 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 @@ -132,7 +132,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetBusHEVOVCSuccessResultWriter(null, XNamespace.None)); Bind<IResultGroupWriter>().To<BusPEVMRFResultWriter>().When(AccessedViaMRFResultsWriterFactory) .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetBusPEVSuccessResultWriter(null, XNamespace.None)); - Bind<IResultGroupWriter>().To<ErrorResultWriter>().When(AccessedViaMRFResultsWriterFactory) + + Bind<IResultGroupWriter>().To<ErrorResultWriter>().When(AccessedViaMRFResultsWriterFactory) .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetBusErrorResultWriter(null, XNamespace.None)); Bind<IResultGroupWriter>().To<ResultSimulationParameterMRFBusWriter>().When(AccessedViaMRFResultsWriterFactory) diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFComponentsType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFComponentsType.cs index 9058ed4aa5ff88dc098cf50a0c048052adb44375..98cc105016903c26d9e04d125a8c84f7376bf912 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFComponentsType.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFComponentsType.cs @@ -7,6 +7,7 @@ using System.Xml.Linq; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider; namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.ManufacturerReport_0_9.ManufacturerReportXMLTypeWriter { @@ -269,11 +270,13 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. public XElement GetElement(IDeclarationInputDataProvider inputData) { var components = inputData.JobInputData.Vehicle.Components; + return new XElement(_mrf + XMLNames.Vehicle_Components, _mrfFactory.GetEngineType().GetElement(inputData), _mrfFactory.GetTransmissionType().GetElement(inputData), components.TorqueConverterInputData != null ? _mrfFactory.GetTorqueConverterType().GetElement(inputData) : null, - components.AngledriveInputData != null ? _mrfFactory.GetAngleDriveType().GetElement(inputData) : null, + (components.AngledriveInputData != null) && (components.AngledriveInputData.Type == AngledriveType.SeparateAngledrive) + ? _mrfFactory.GetAngleDriveType().GetElement(inputData) : null, components.RetarderInputData != null ? _mrfFactory.GetRetarderType().GetElement(inputData) : null, components.AxleGearInputData != null ? _mrfFactory.GetAxleGearType().GetElement(inputData) : null, diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultsWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultsWriter.cs index bb062af0533869d4eb8a5f9d23dd55c95f2a2f35..fbd756f1091fed544193f45a166864d87ea1b6fd 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultsWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/MRFResultsWriter.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Xml.Linq; using TUGraz.VectoCommon.Resources; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common; @@ -29,10 +30,9 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation #region Overrides of AbstractResultsWriter protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetLorryConvSuccessResultWriter(_mrfFactory, TNS); - protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetLorryErrorResultWriter(_mrfFactory, TNS); - public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetLorryConvSummaryWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetLorryConvSummaryWriter(_mrfFactory, TNS); #endregion } @@ -44,7 +44,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetLorryHEVNonOVCSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetLorryErrorResultWriter(_mrfFactory, TNS); - public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetLorryHEVNonOVCSummaryWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetLorryHEVNonOVCSummaryWriter(_mrfFactory, TNS); } @@ -57,7 +57,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation public override XElement GenerateResults(List<IResultEntry> results) { var ordered = GetOrderedResultsOVC(results); - var allSuccess = results.All(x => x.Status == VectoRun.Status.Success); + var allSuccess = results.All(x => x.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore)); return new XElement(TNS + XMLNames.Report_Results, new XElement(TNS + XMLNames.Report_Result_Status, allSuccess @@ -76,6 +76,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetLorryHEVOVCSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetLorryErrorResultWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetLorryHEVOVCSummaryWriter(_mrfFactory, TNS); } @@ -86,7 +87,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetLorryPEVSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetLorryErrorResultWriter(_mrfFactory, TNS); - + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetLorryPEVSummaryWriter(_mrfFactory, TNS); } @@ -97,6 +98,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetBusConvSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetBusErrorResultWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetBusConvSummaryWriter(_mrfFactory, TNS); } @@ -107,6 +109,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetBusHEVNonOVCSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetLorryErrorResultWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetBusHEVNonOVCSummaryWriter(_mrfFactory, TNS); } @@ -118,15 +121,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation public override XElement GenerateResults(List<IResultEntry> results) { var ordered = GetOrderedResultsOVC(results); - var allSuccess = results.All(x => x.Status == VectoRun.Status.Success); + var allSuccess = results.All(x => x.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore)); return new XElement(TNS + XMLNames.Report_Results, new XElement(TNS + XMLNames.Report_Result_Status, allSuccess ? XMLNames.Report_Results_Status_Success_Val : XMLNames.Report_Results_Status_Error_Val), ordered.Select(x => - x.ChargeDepletingResult.Status == VectoRun.Status.Success && - x.ChargeSustainingResult.Status == VectoRun.Status.Success + x.ChargeDepletingResult.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore) && + x.ChargeSustainingResult.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore) ? ResultSuccessWriter.GetElement(x) : ResultErrorWriter.GetElement(x)), SummaryWriter.GetElement(ordered) @@ -135,6 +138,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetBusHEVOVCSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetBusErrorResultWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetBusHEVOVCSummaryWriter(_mrfFactory, TNS); } @@ -145,6 +149,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => _mrfFactory.GetBusPEVSuccessResultWriter(_mrfFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _mrfFactory.GetBusErrorResultWriter(_mrfFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _mrfFactory.GetBusPEVSummaryWriter(_mrfFactory, TNS); } @@ -164,6 +169,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation protected override IResultGroupWriter ResultSuccessWriter => null; protected override IResultGroupWriter ResultErrorWriter => null; + public override IReportResultsSummaryWriter SummaryWriter => null; diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/ResultGroupWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/ResultGroupWriter.cs index fc5c1821fba6addb217174d98ce72522800540e5..c21e18d186a72764d05fde9ced10cd2831b785a4 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/ResultGroupWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ResultWriter/ResultGroupWriter.cs @@ -4,6 +4,7 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common; using TUGraz.VectoCore.Utils; @@ -62,9 +63,28 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. public override XElement GetElement(IResultEntry entry) { + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MinSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MaxSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MaxDeceleration, new ConvertedSI(double.NaN, XMLNames.Unit_mps2).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MaxAcceleration, new ConvertedSI(double.NaN, XMLNames.Unit_mps2).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_FullLoadDrivingtimePercentage, 0), + new XElement(TNS + XMLNames.Report_ResultEntry_GearshiftCount, 0), + new XElement(TNS + XMLNames.Report_ResultEntry_EngineSpeedDriving, + new XElement(TNS + XMLNames.Report_ResultEntry_EngineSpeedDriving_Min, new ConvertedSI(double.NaN, XMLNames.Unit_RPM).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_EngineSpeedDriving_Avg, new ConvertedSI(double.NaN, XMLNames.Unit_RPM).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_EngineSpeedDriving_Max, new ConvertedSI(double.NaN, XMLNames.Unit_RPM).ValueAsUnit()) + ), + new XElement(TNS + XMLNames.Report_Results_AverageGearboxEfficiency, new ConvertedSI(double.NaN, XMLNames.UnitPercent).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_Results_AverageAxlegearEfficiency, new ConvertedSI(double.NaN, XMLNames.UnitPercent).ValueAsUnit()) + ); + } return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, - new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, entry.AverageSpeed.ValueAsUnit("km/h", 1)), - new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, entry.AverageDrivingSpeed.ValueAsUnit("km/h", 1)), + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, entry.AverageSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, entry.AverageDrivingSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), new XElement(TNS + XMLNames.Report_ResultEntry_MinSpeed, entry.MinSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), new XElement(TNS + XMLNames.Report_ResultEntry_MaxSpeed, entry.MaxSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), new XElement(TNS + XMLNames.Report_ResultEntry_MaxDeceleration, entry.MaxDeceleration.ValueAsUnit(XMLNames.Unit_mps2, 2)), @@ -84,6 +104,12 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. public override XElement GetElement(IOVCResultEntry entry) { var weighted = entry.Weighted; + if (weighted.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()) + ); + } return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, weighted.AverageSpeed.ValueAsUnit("km/h", 1)), new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, weighted.AverageDrivingSpeed.ValueAsUnit("km/h", 1)) @@ -101,9 +127,23 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. public override XElement GetElement(IResultEntry entry) { - return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, - new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, entry.AverageSpeed.ValueAsUnit("km/h", 1)), - new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, entry.AverageDrivingSpeed.ValueAsUnit("km/h", 1)), + if (entry.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MinSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MaxSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MaxDeceleration, new ConvertedSI(double.NaN, XMLNames.Unit_mps2).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_MaxAcceleration, new ConvertedSI(double.NaN, XMLNames.Unit_mps2).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_FullLoadDrivingtimePercentage, 0), + new XElement(TNS + XMLNames.Report_ResultEntry_GearshiftCount, 0), + new XElement(TNS + XMLNames.Report_Results_AverageGearboxEfficiency, new ConvertedSI(double.NaN, XMLNames.UnitPercent).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_Results_AverageAxlegearEfficiency, new ConvertedSI(double.NaN, XMLNames.UnitPercent).ValueAsUnit()) + ); + } + return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, entry.AverageSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, entry.AverageDrivingSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), new XElement(TNS + XMLNames.Report_ResultEntry_MinSpeed, entry.MinSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), new XElement(TNS + XMLNames.Report_ResultEntry_MaxSpeed, entry.MaxSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), new XElement(TNS + XMLNames.Report_ResultEntry_MaxDeceleration, entry.MaxDeceleration.ValueAsUnit(XMLNames.Unit_mps2, 2)), @@ -118,9 +158,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport. public override XElement GetElement(IOVCResultEntry entry) { var weighted = entry.Weighted; - return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, - new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, weighted.AverageSpeed.ValueAsUnit("km/h", 1)), - new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, weighted.AverageDrivingSpeed.ValueAsUnit("km/h", 1)) + if (weighted.Status == VectoRun.Status.PrimaryBusSimulationIgnore) { + return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, new ConvertedSI(double.NaN, XMLNames.Unit_kmph).ValueAsUnit()) + ); + } + return new XElement(TNS + XMLNames.Report_ResultEntry_VehiclePerformance, + new XElement(TNS + XMLNames.Report_ResultEntry_AverageSpeed, weighted.AverageSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)), + new XElement(TNS + XMLNames.Report_ResultEntry_AvgDrivingSpeed, weighted.AverageDrivingSpeed.ValueAsUnit(XMLNames.Unit_kmph, 1)) ); } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/InterimComponents/InterimAirdragType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/InterimComponents/InterimAirdragType.cs index 8c46e113dc45dac8b77b46cbbfe491f049cb3f66..2bbe6fbd6fad3046abf393664a51bb188815bb0f 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/InterimComponents/InterimAirdragType.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/InterimComponents/InterimAirdragType.cs @@ -71,18 +71,22 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF { var retVal = new XElement(v24 + XMLNames.Component_AirDrag); - - var tmp = XElement.Load(inputData.XMLSource.CreateNavigator().ReadSubtree()); var dataElement = tmp.Descendants().Where(e => e.Name.LocalName == XMLNames.ComponentDataWrapper).First(); dataElement.Name = v20 + XMLNames.ComponentDataWrapper; dataElement.SetAttributeValue("xmlns", inputData.DataSource.TypeVersion); - //dataElement.Add(new XAttribute("xmlns", inputData.DataSource.TypeVersion)); + + //Remove prefix from value of type attribute. + for (var ptr = dataElement.FirstAttribute; ptr != null; ptr = ptr.NextAttribute) { + if (!ptr.IsNamespaceDeclaration && (ptr.Name.LocalName == "type") && ptr.Value.Contains(':')) { + ptr.Value = ptr.Value.Split(':').Last(); + break; + } + } var signatureElement = tmp.Descendants().Where(e => e.Name.LocalName == XMLNames.DI_Signature).First(); signatureElement.Name = v20 + XMLNames.DI_Signature; - retVal.Add(dataElement, signatureElement); return retVal; diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFAxleWheelsType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFAxleWheelsType.cs index 6c77e57080c9ddbc55ca5899479499d5e96b709c..d37eb3888645a654ae97783ae2cb5a4b700b1799 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFAxleWheelsType.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFAxleWheelsType.cs @@ -72,7 +72,10 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF if (defaultNsAttr != null) { defaultNsAttr.Value = xmlTyre.GetXmlNode.GetNamespaceOfPrefix(parts.First()); } else { - ptr.Parent.Add(new XAttribute("xmlns", ptr.Parent.GetNamespaceOfPrefix(parts.First()))); + var ns = ptr.Parent.GetNamespaceOfPrefix(parts.First()) + ?? xmlTyre.GetXmlNode.GetNamespaceOfPrefix(parts.First()); + + ptr.Parent.Add(new XAttribute("xmlns", ns)); } } ptr = ptr.NextAttribute; 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 3cc200f5d7e7945cfbc9938d0718f8bce0d3f17f..b9042b46730d91252ad2ead095e1ebf70bc1a78f 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 @@ -108,36 +108,13 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF #endregion } - public class VIFFuelConsumptionWriter : AbstractResultWriter, IFuelConsumptionWriter - { + public class VIFFuelConsumptionWriter : FuelConsumptionWriterBase + { public VIFFuelConsumptionWriter(ICommonResultsWriterFactory factory, XNamespace ns) : base(factory, ns) { } + protected override string FCElementName { get; } = XMLNames.Report_Result_EnergyConsumption; - #region Implementation of IFuelConsumptionWriter - - 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_Result_EnergyConsumption, new FormattedReportValue(x).GetElement())) - ); - } - - 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_Result_EnergyConsumption, new FormattedReportValue(x).GetElement())) - ); - } - - #endregion - - public virtual IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, IFuelProperties fuel, + public override IList<ConvertedSI> GetFuelConsumptionEntries(Kilogram fc, IFuelProperties fuel, Meter distance, Kilogram payload, CubicMeter volume, double? passenger) { return new List<ConvertedSI> { diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs index 8333e19b16ede084fe38ac96e113cad365b0d0ae..d7b983320f796478a1d9ee4039e45343b463f489 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/ResultWriter/VIFResultsWriter.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Xml.Linq; using TUGraz.VectoCommon.Resources; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.Common; using TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformationFile.CustomerInformationFile_0_9.ResultWriter; @@ -28,7 +30,8 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusConvSuccessResultWriter(_vifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS); - public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusConvSummaryWriter(_vifFactory, TNS); + + public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusConvSummaryWriter(_vifFactory, TNS); } @@ -38,6 +41,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusHEVNonOVCSuccessResultWriter(_vifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusHEVNonOVCSummaryWriter(_vifFactory, TNS); } @@ -49,15 +53,15 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF public override XElement GenerateResults(List<IResultEntry> results) { var ordered = GetOrderedResultsOVC(results); - var allSuccess = results.All(x => x.Status == VectoRun.Status.Success); + var allSuccess = results.All(x => x.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore)); return new XElement(TNS + XMLNames.Report_Results, new XElement(TNS + XMLNames.Report_Result_Status, allSuccess ? XMLNames.Report_Results_Status_Success_Val : XMLNames.Report_Results_Status_Error_Val), ordered.Select(x => - x.ChargeDepletingResult.Status == VectoRun.Status.Success && - x.ChargeSustainingResult.Status == VectoRun.Status.Success + x.ChargeDepletingResult.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore) && + x.ChargeSustainingResult.Status.IsOneOf(VectoRun.Status.Success, VectoRun.Status.PrimaryBusSimulationIgnore) ? ResultSuccessWriter.GetElement(x) : ResultErrorWriter.GetElement(x)), SummaryWriter.GetElement(ordered) @@ -66,6 +70,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusHEVOVCSuccessResultWriter(_vifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusHEVOVCSummaryWriter(_vifFactory, TNS); } @@ -76,6 +81,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF protected override IResultGroupWriter ResultSuccessWriter => _vifFactory.GetBusPEVSuccessResultWriter(_vifFactory, TNS); protected override IResultGroupWriter ResultErrorWriter => _vifFactory.GetBusErrorResultWriter(_vifFactory, TNS); + public override IReportResultsSummaryWriter SummaryWriter => _vifFactory.GetBusPEVSummaryWriter(_vifFactory, TNS); } @@ -95,6 +101,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF protected override IResultGroupWriter ResultSuccessWriter => null; protected override IResultGroupWriter ResultErrorWriter => null; + public override IReportResultsSummaryWriter SummaryWriter => null; diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs index 9ff32e359008eeb1fd9262132dca6fbf4cc87159..465c269d2f4bca83fc234f828b3464758d059690 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/VIFResultsNinjectModule.cs @@ -70,7 +70,6 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF Bind<ICO2Writer>().To<VIFCO2Writer>().When(AccessedViaVIFResultsWriterFactory) .NamedLikeFactoryMethod((IMRFResultsWriterFactory c) => c.GetCO2ResultPEVBus(null, XNamespace.None)); - Bind<IResultGroupWriter>().To<VIFErrorResultWriter>().When(AccessedViaVIFResultsWriterFactory) .NamedLikeFactoryMethod((IVIFResultsWriterFactory c) => c.GetBusErrorResultWriter(null, XNamespace.None)); Bind<IResultSequenceWriter>().To<VIFResultErrorMissionWriter>().When(AccessedViaVIFResultsWriterFactory) diff --git a/VectoCore/VectoCore/Resources/Declaration/PrimaryBusSegmentationTable.csv b/VectoCore/VectoCore/Resources/Declaration/PrimaryBusSegmentationTable.csv index 5b6ad006c92d7d590538b2c778c9b775cbc640f5..db7aba2560755e4fb0d14d521d9efdfc88cabe10 100644 --- a/VectoCore/VectoCore/Resources/Declaration/PrimaryBusSegmentationTable.csv +++ b/VectoCore/VectoCore/Resources/Declaration/PrimaryBusSegmentationTable.csv @@ -1,26 +1,26 @@ -HDV group , Production Stage , Vehicle Category , HDV SuperGroup , Articulated , Num Axles , TPMLM_Min , TPMLM_Max , doubledecker , vehicle code , low entry , floor type , DesignSpeed , Body , .vacc file , Cross Wind Correction , CdxA Standard , AxlesWeights , Width , Length , Body Height , entrance height , CurbMass , PassengersLowerDeck , PassengersUpperDeck , Heavy Urban , Urban , Suburban , Interurban , Coach , ES_External displays , ES_Internal displays , ES_Fridge , ES_Kitchen Standard , HVAC System Configuration , HeatPump Cooling Passenger conventional , HeatPump Cooling Passenger HEV , HeatPump Cooling Passenger PEV , HeatPump Heating Passenger conventional , HeatPump Heating Passenger HEV , HeatPump Heating Passenger PEV , HVAC Aux Heater conventional , HVAC Aux Heater HEV , HVAC Aux Heater PEV , WaterElectricHeater conventional , WaterElectricHeater HEV , WaterElectricHeater PEV , HVAC Double Glasing , HVAC Adjustable AuxiliaryHeater , HVAC SeparateAirDistributionDucts , ICE Displacement , Fuel Capacity +HDV group , Production Stage , Vehicle Category , HDV SuperGroup , Articulated , Num Axles , TPMLM_Min , TPMLM_Max , doubledecker , vehicle code , low entry , floor type , DesignSpeed , Body , .vacc file , Cross Wind Correction , CdxA Standard , AxlesWeights , Width , Length , Body Height , entrance height , CurbMass , CurbMass TPMLM Factor , PassengersLowerDeck , PassengersUpperDeck , Heavy Urban , Urban , Suburban , Interurban , Coach , ES_External displays , ES_Internal displays , ES_Fridge , ES_Kitchen Standard , HVAC System Configuration , HeatPump Cooling Passenger conventional , HeatPump Cooling Passenger HEV , HeatPump Cooling Passenger PEV , HeatPump Heating Passenger conventional , HeatPump Heating Passenger HEV , HeatPump Heating Passenger PEV , HVAC Aux Heater conventional , HVAC Aux Heater HEV , HVAC Aux Heater PEV , WaterElectricHeater conventional , WaterElectricHeater HEV , WaterElectricHeater PEV , HVAC Double Glasing , HVAC Adjustable AuxiliaryHeater , HVAC SeparateAirDistributionDucts , ICE Displacement , Fuel Capacity ## Heavy Bus Primary Vehicles -P31SD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 0 , CE , 0 , low floor , 100 , , Bus.vacc , CoachBus , 4.9 , 37.5/62.5 , 2.55 , 12 , 2.8 , 340 , 11975 , 80 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 2 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 -P31DD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 1 , CF , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.2 , 37.5/62.5 , 2.55 , 10.5 , 3.8 , 340 , 12350 , 60 , 40 , 3.7 , 3.7 , 3.7 , , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 -P32SD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 0 , CA , - , high floor , 100 , , Bus.vacc , CoachBus , 3.45 , 37.5/62.5 , 2.55 , 12 , 3.15 , 340 , 13150 , 45 , 0 , , , , 2.2/1.8 , 1.4 , 2 , 2 , 0.5 , 0.5 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 -P32DD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 1 , CB , - , high floor , 100 , , Bus.vacc , CoachBus , 3.9 , 37.5/62.5 , 2.55 , 10.5 , 3.7 , 340 , 13400 , 25 , 35 , , , , 3/2.5 , 2 , 1 , 2 , 1 , 1 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 +P31SD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 0 , CE , 0 , low floor , 100 , , Bus.vacc , CoachBus , 4.9 , 37.5/62.5 , 2.55 , 12 , 2.8 , 340 , 11975 , 0.7 , 80 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 2 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 +P31DD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 1 , CF , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.2 , 37.5/62.5 , 2.55 , 10.5 , 3.8 , 340 , 12350 , 0.7 , 60 , 40 , 3.7 , 3.7 , 3.7 , , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 +P32SD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 0 , CA , - , high floor , 100 , , Bus.vacc , CoachBus , 3.45 , 37.5/62.5 , 2.55 , 12 , 3.15 , 340 , 13150 , 0.75 , 45 , 0 , , , , 2.2/1.8 , 1.4 , 2 , 2 , 0.5 , 0.5 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 +P32DD , 1 , HeavyBus , P31_32 , - , 2 , 7.4 , 999 , 1 , CB , - , high floor , 100 , , Bus.vacc , CoachBus , 3.9 , 37.5/62.5 , 2.55 , 10.5 , 3.7 , 340 , 13400 , 0.75 , 25 , 35 , , , , 3/2.5 , 2 , 1 , 2 , 1 , 1 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 ## , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , - , - -P33SD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 0 , CE , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.0 , 27.3/45.4/27.3 , 2.55 , 14.2 , 2.8 , 340 , 14175 , 104 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 2 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 -P33DD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 1 , CF , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.3 , 27.3/45.4/27.3 , 2.55 , 13.5 , 3.8 , 340 , 14725 , 78 , 52 , 3.7 , 3.7 , 3.7 , , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 -P34SD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 0 , CA , - , high floor , 100 , , Bus.vacc , CoachBus , 3.53 , 27.3/45.4/27.3 , 2.55 , 13.8 , 3.15 , 340 , 15213 , 59 , 0 , , , , 2.2/1.8 , 1.4 , 2 , 2 , 0.5 , 0.5 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 -P34DD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 1 , CB , - , high floor , 100 , , Bus.vacc , CoachBus , 3.98 , 27.3/45.4/27.3 , 2.55 , 14 , 3.7 , 340 , 17850 , 33 , 46 , , , , 3/2.5 , 2 , 1 , 4 , 1 , 1.5 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 +P33SD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 0 , CE , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.0 , 27.3/45.4/27.3 , 2.55 , 14.2 , 2.8 , 340 , 14175 , , 104 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 2 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 +P33DD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 1 , CF , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.3 , 27.3/45.4/27.3 , 2.55 , 13.5 , 3.8 , 340 , 14725 , , 78 , 52 , 3.7 , 3.7 , 3.7 , , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 +P34SD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 0 , CA , - , high floor , 100 , , Bus.vacc , CoachBus , 3.53 , 27.3/45.4/27.3 , 2.55 , 13.8 , 3.15 , 340 , 15213 , , 59 , 0 , , , , 2.2/1.8 , 1.4 , 2 , 2 , 0.5 , 0.5 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 +P34DD , 1 , HeavyBus , P33_34 , 0 , 3 , 7.4 , 999 , 1 , CB , - , high floor , 100 , , Bus.vacc , CoachBus , 3.98 , 27.3/45.4/27.3 , 2.55 , 14 , 3.7 , 340 , 17850 , , 33 , 46 , , , , 3/2.5 , 2 , 1 , 4 , 1 , 1.5 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 ## , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , - , - -P35SD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 0 , CG , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.1 , 24.3/35.2/40.5 , 2.55 , 18.2 , 2.8 , 340 , 17800 , 104 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 -P35DD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 1 , CH , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.4 , 24.3/35.2/40.5 , 2.55 , 18.2 , 3.8 , 340 , 20250 , 78 , 52 , 3.7 , 3.7 , 3.7 , , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 -P36SD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 0 , CC , - , high floor , 100 , , Bus.vacc , CoachBus , 3.60 , 24.3/35.2/40.5 , 2.55 , 18.2 , 3.15 , 340 , 19267 , 59 , 0 , , , , 2.2/1.8 , 1.4 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 -P36DD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 1 , CD , - , high floor , 100 , , Bus.vacc , CoachBus , 4.05 , 24.3/35.2/40.5 , 2.55 , 18.2 , 3.7 , 340 , 21375 , 33 , 46 , , , , 3/2.5 , 2 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 +P35SD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 0 , CG , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.1 , 24.3/35.2/40.5 , 2.55 , 18.2 , 2.8 , 340 , 17800 , , 104 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 +P35DD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 1 , CH , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.4 , 24.3/35.2/40.5 , 2.55 , 18.2 , 3.8 , 340 , 20250 , , 78 , 52 , 3.7 , 3.7 , 3.7 , , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 7.7 , 250 +P36SD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 0 , CC , - , high floor , 100 , , Bus.vacc , CoachBus , 3.60 , 24.3/35.2/40.5 , 2.55 , 18.2 , 3.15 , 340 , 19267 , , 59 , 0 , , , , 2.2/1.8 , 1.4 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 +P36DD , 1 , HeavyBus , P35_36 , 1 , 3 , 7.4 , 999 , 1 , CD , - , high floor , 100 , , Bus.vacc , CoachBus , 4.05 , 24.3/35.2/40.5 , 2.55 , 18.2 , 3.7 , 340 , 21375 , , 33 , 46 , , , , 3/2.5 , 2 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 10.7 , 400 ## , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , , - , - -P37SD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 0 , CE , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.1 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 2.8 , 340 , 15000 , 125 , 0 , 3 , 3 , 3 , 2.2/1.8 , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 -P37DD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 1 , CF , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.4 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 3.8 , 340 , 18700 , 94 , 62 , 3.7 , 3.7 , 3.7 , , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 -P38SD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 0 , CA , - , high floor , 100 , , Bus.vacc , CoachBus , 3.60 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 3.15 , 340 , 17500 , 70 , 0 , , , , 2.2/1.8 , 1.4 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 -P38DD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 1 , CB , - , high floor , 100 , , Bus.vacc , CoachBus , 4.05 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 3.7 , 340 , 21200 , 39 , 55 , , , , 3/2.5 , 2 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 +P37SD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 0 , CE , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.1 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 2.8 , 340 , 15000 , , 125 , 0 , 3 , 3 , 3 , 2.2/1.8 , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 +P37DD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 1 , CF , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.4 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 3.8 , 340 , 18700 , , 94 , 62 , 3.7 , 3.7 , 3.7 , , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 +P38SD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 0 , CA , - , high floor , 100 , , Bus.vacc , CoachBus , 3.60 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 3.15 , 340 , 17500 , , 70 , 0 , , , , 2.2/1.8 , 1.4 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 +P38DD , 1 , HeavyBus , P37_38 , 0 , 4 , 7.4 , 999 , 1 , CB , - , high floor , 100 , , Bus.vacc , CoachBus , 4.05 , 21.4/21.4/35.8/21.4 , 2.55 , 15 , 3.7 , 340 , 21200 , , 39 , 55 , , , , 3/2.5 , 2 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 ## , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , ----- , - , - -P39SD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 0 , CG , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.2 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 2.6 , 340 , 19600 , 125 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 -P39DD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 1 , CH , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.5 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 3.8 , 340 , 24800 , 94 , 62 , 3.7 , 3.7 , 3.7 , , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 -P40SD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 0 , CC , - , high floor , 100 , , Bus.vacc , CoachBus , 3.68 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 3.15 , 340 , 20950 , 70 , 0 , , , , 2.2/1.8 , 1.4 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 -P40DD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 1 , CD , - , high floor , 100 , , Bus.vacc , CoachBus , 4.13 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 3.7 , 340 , 24600 , 39 , 55 , , , , 3/2.5 , 2 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 +P39SD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 0 , CG , 0 , low floor , 100 , , Bus.vacc , CoachBus , 5.2 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 2.6 , 340 , 19600 , , 125 , 0 , 3 , 3 , 3 , 2.2/1.8 , , 3 , 3 , 0 , 0 , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 +P39DD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 1 , CH , 0 , low floor , 100 , , Bus.vacc , CoachBus , 6.5 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 3.8 , 340 , 24800 , , 94 , 62 , 3.7 , 3.7 , 3.7 , , , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 15 , 15 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 10.7 , 300 +P40SD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 0 , CC , - , high floor , 100 , , Bus.vacc , CoachBus , 3.68 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 3.15 , 340 , 20950 , , 70 , 0 , , , , 2.2/1.8 , 1.4 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 +P40DD , 1 , HeavyBus , P39_40 , 1 , 4 , 7.4 , 999 , 1 , CD , - , high floor , 100 , , Bus.vacc , CoachBus , 4.13 , 20.0/28.2/32.4/19.4 , 2.55 , 21 , 3.7 , 340 , 24600 , , 39 , 55 , , , , 3/2.5 , 2 , , , , , 6 , non R-744 2-stage , non R-744 2-stage , non R-744 continuous , none , none , non R-744 continuous , 30 , 30 , 0 , 0 , 0 , 1 , 1 , 0 , 1 , 12.8 , 500 diff --git a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.4.xsd b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.4.xsd index 5f78f2d9ce631ff35afef317058e4995668383e0..da12d05410c6616a3561ef9c4c24ff9996685a6c 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.4.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.4.xsd @@ -20,6 +20,7 @@ Changelog: - changed Small + elec. driven + ESS to Small + AMS + elec. driven 13.06.2023: Changed rated current, rated voltage, rated capacity (bus aux smart electrics) from datatype xs:integer to xs:int 19.10.2023: remove erroneous lorry PS technology entry + 09.02.2024: added missing technology for exempted vehicles 'Multiple powertrains Article 9 exempted' --> <xs:complexType name="Abstract_ADAS_ConventionalType" abstract="true"> <xs:complexContent> @@ -1798,6 +1799,7 @@ Changelog: <xs:enumeration value="H2 ICE"/> <xs:enumeration value="Dual fuel vehicle Article 9 exempted"/> <xs:enumeration value="In-motion charging Article 9 exempted"/> + <xs:enumeration value="Multiple powertrains Article 9 exempted"/> <xs:enumeration value="Other technology Article 9 exempted"/> </xs:restriction> </xs:simpleType> @@ -1859,6 +1861,7 @@ Changelog: <xs:enumeration value="H2 ICE"/> <xs:enumeration value="Dual fuel vehicle Article 9 exempted"/> <xs:enumeration value="In-motion charging Article 9 exempted"/> + <xs:enumeration value="Multiple powertrains Article 9 exempted"/> <xs:enumeration value="Other technology Article 9 exempted"/> </xs:restriction> </xs:simpleType> @@ -1895,6 +1898,7 @@ Changelog: <xs:enumeration value="H2 ICE"/> <xs:enumeration value="Dual fuel vehicle Article 9 exempted"/> <xs:enumeration value="In-motion charging Article 9 exempted"/> + <xs:enumeration value="Multiple powertrains Article 9 exempted"/> <xs:enumeration value="Other technology Article 9 exempted"/> </xs:restriction> </xs:simpleType> diff --git a/VectoCore/VectoCore/Resources/XSD/VectoOutputManufacturer.0.9.xsd b/VectoCore/VectoCore/Resources/XSD/VectoOutputManufacturer.0.9.xsd index 9601c06c07cda446ed45ebc1cb8099cbcab3e212..fc7cc59f917a0170563438d4bcf8bd6ad604c7bd 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoOutputManufacturer.0.9.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoOutputManufacturer.0.9.xsd @@ -3194,7 +3194,7 @@ Changelog <xs:documentation>I.1.1.28.</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="NgTankSystem" type="v1.0:NgTankSystemType"> + <xs:element name="NgTankSystem" type="v1.0:NgTankSystemType" minOccurs="0"> <xs:annotation> <xs:documentation>I.1.1.29.</xs:documentation> </xs:annotation> @@ -3210,7 +3210,7 @@ Changelog <xs:documentation>I.1.1.28.</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="NgTankSystem" type="v1.0:NgTankSystemType"> + <xs:element name="NgTankSystem" type="v1.0:NgTankSystemType" minOccurs="0"> <xs:annotation> <xs:documentation>I.1.1.29</xs:documentation> </xs:annotation> diff --git a/VectoCore/VectoCore/Resources/XSD/VectoOutputMultistep.0.1.xsd b/VectoCore/VectoCore/Resources/XSD/VectoOutputMultistep.0.1.xsd index 984d62320ac7a080442fd5f935fd207e40cac832..91e108741ef196f891d2bd6be8a7645d4f5a8e11 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoOutputMultistep.0.1.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoOutputMultistep.0.1.xsd @@ -8,7 +8,11 @@ <xs:import namespace="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" schemaLocation="VectoDeclarationDefinitions.2.1.xsd"/> <xs:import namespace="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" schemaLocation="VectoDeclarationDefinitions.2.3.xsd"/> <xs:import namespace="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" schemaLocation="VectoDeclarationDefinitions.2.4.xsd"/> - <xs:complexType name="ElectricMachineSystemMaxTorqueEntryType"> + <!-- + Changelog: + 18.01.2024: change restrictions of EM continuous torque - allow 0.00 + --> + <xs:complexType name="ElectricMachineSystemMaxTorqueEntryType"> <xs:attribute name="outShaftSpeed" type="v2.3:OutShaftSpeedType" use="required"> <xs:annotation> <xs:documentation>P468 - [rpm]</xs:documentation> @@ -1617,10 +1621,15 @@ <xs:documentation>P467 - [V]</xs:documentation> </xs:annotation> </xs:element> - <xs:element name="ContinuousTorque" type="v2.3:MaxTorqueType"> + <xs:element name="ContinuousTorque"> <xs:annotation> <xs:documentation>P459 - [Nm]</xs:documentation> </xs:annotation> + <xs:simpleType> + <xs:restriction base="v1.0:Double2"> + <xs:minInclusive value="0.00"/> + </xs:restriction> + </xs:simpleType> </xs:element> <xs:element name="TestSpeedContinuousTorque" type="v2.3:TestSpeedType"> <xs:annotation> diff --git a/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs b/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs index d2a79ea3f110d80989ef8f0373b6d23ee198cd38..e26de51bc109e64f6c22429cb7ff7662b31f5171 100644 --- a/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs +++ b/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Linq.Expressions; using Moq; @@ -8,10 +9,18 @@ using NUnit.Framework; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.AuxiliaryDataAdapter; +using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRunDataFactory; +using TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDataFactory; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory; +using TUGraz.VectoCore.Tests.InputData.RunDataFactory; using TUGraz.VectoCore.Utils.Ninject; namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest @@ -19,27 +28,30 @@ namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest [TestFixture] public class DeclarationDataAdapterTest { - private IDeclarationDataAdapterFactory _declarationDataAdapterFactory; + protected IKernel _kernel; + private IVectoRunDataFactoryFactory _runDataFactoryFactory; + [OneTimeSetUp] public void OneTimeSetup() { - var kernel = new StandardKernel(new VectoNinjectModule()); - _declarationDataAdapterFactory = kernel.Get<IDeclarationDataAdapterFactory>(); - } + _kernel = new StandardKernel(new VectoNinjectModule()); + _runDataFactoryFactory = _kernel.Get<IVectoRunDataFactoryFactory>(); + } + #region LorriesSerialHybridVehicle - + #endregion [TestCase(VectoSimulationJobType.BatteryElectricVehicle, - new []{ "Full electric steering gear" }, + new[] { "Full electric steering gear" }, "Vacuum pump + elec. driven", true, 2, - TestName="PEVAuxFailSteeredAxle")] + TestName = "PEVAuxFailSteeredAxle")] [TestCase(VectoSimulationJobType.BatteryElectricVehicle, new[] { "Full electric steering gear" }, "Vacuum pump + elec. driven", @@ -60,19 +72,19 @@ namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest "Vacuum pump + elec. driven", false, TestName = "PHEVAuxPass")] - public void HeavyLorryPEVAuxiliaryDataAdapterFailTest(VectoSimulationJobType jobType, string[] spTechnologies, string psTechnology, bool fail, int? steeredAxles = null) + public void HeavyLorryPEVAuxiliaryDataAdapterFailTest(VectoSimulationJobType jobType, string[] spTechnologies, + string psTechnology, bool fail, int? steeredAxles = null) { var dataAdapter = new HeavyLorryPEVAuxiliaryDataAdapter(); - + var auxData = new Mock<IAuxiliariesDeclarationInputData>(); Mock<IAuxiliaryDeclarationInputData> steeringSystem = new Mock<IAuxiliaryDeclarationInputData>(); - foreach(var spTechnoly in spTechnologies) - { + foreach (var spTechnoly in spTechnologies) { steeringSystem.SetType(AuxiliaryType.SteeringPump) .AddTechnology(spTechnoly); } - + var hvac = new Mock<IAuxiliaryDeclarationInputData>() .SetType(AuxiliaryType.HVAC) .AddTechnology("Default"); @@ -83,7 +95,7 @@ namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest .SetType(AuxiliaryType.ElectricSystem) .AddTechnology("Standard technology"); - + auxData.AddAuxiliaries(steeringSystem.Object, hvac.Object, pneumatic.Object, elSystem.Object); @@ -98,8 +110,490 @@ namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest } } } - } + private const AxleConfiguration Axl2 = AxleConfiguration.AxleConfig_4x2; + private const AxleConfiguration Axl3 = AxleConfiguration.AxleConfig_6x2; + + [ + // testcases for vehicle mass with a high tpmlm + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 0, + VehicleClass.ClassP31SD, 11975), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 0, + VehicleClass.ClassP31SD, 12291), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 0, + VehicleClass.ClassP31SD, 12291), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 0, + VehicleClass.ClassP31SD, 11416), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 4, + VehicleClass.ClassP31DD, 12350), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 4, + VehicleClass.ClassP31DD, 12666), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 4, + VehicleClass.ClassP31DD, 12666), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 4, + VehicleClass.ClassP31DD, 11791), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 7, + VehicleClass.ClassP32SD, 13150), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 7, + VehicleClass.ClassP32SD, 13466), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 7, + VehicleClass.ClassP32SD, 13466), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 7, + VehicleClass.ClassP32SD, 12229), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 9, + VehicleClass.ClassP32DD, 13400), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 9, + VehicleClass.ClassP32DD, 13716), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 9, + VehicleClass.ClassP32DD, 13716), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 9, + VehicleClass.ClassP32DD, 12479), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 25000, 0, + VehicleClass.ClassP33SD, 14175), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 25000, 0, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 25000, 0, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 25000, 0, + VehicleClass.ClassP33SD, 13616), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 25000, 4, + VehicleClass.ClassP33DD, 14725), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 25000, 4, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 25000, 4, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 25000, 4, + VehicleClass.ClassP33DD, 14166), + ] + public void PrimaryBusCurbMassTest_HighTPMLM(VectoSimulationJobType jobType, ArchitectureID archId, + AxleConfiguration axleConfiguration, bool articulated, double TPMLM, int runIdx, + VehicleClass expectedVehicleClass, double expectedCurbMass) + { + PrimaryBusCurbMassTest(jobType, archId, axleConfiguration, articulated, TPMLM, runIdx, expectedVehicleClass, expectedCurbMass); + } + + [ + // testcases for vehicle mass with a low tpmlm + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 0, + VehicleClass.ClassP31SD, 13000 * 0.7), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 0, + VehicleClass.ClassP31SD, 13000 * 0.7), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 0, + VehicleClass.ClassP31SD, 13000 * 0.7), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 0, + VehicleClass.ClassP31SD, 13000 * 0.7), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 4, + VehicleClass.ClassP31DD, 13000 * 0.7), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 4, + VehicleClass.ClassP31DD, 13000 * 0.7), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 4, + VehicleClass.ClassP31DD, 13000 * 0.7), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 4, + VehicleClass.ClassP31DD, 13000 * 0.7), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 7, + VehicleClass.ClassP32SD, 13000 * 0.75), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 7, + VehicleClass.ClassP32SD, 13000 * 0.75), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 7, + VehicleClass.ClassP32SD, 13000 * 0.75), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 7, + VehicleClass.ClassP32SD, 13000 * 0.75), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 9, + VehicleClass.ClassP32DD, 13000 * 0.75), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 9, + VehicleClass.ClassP32DD, 13000 * 0.75), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 9, + VehicleClass.ClassP32DD, 13000 * 0.75), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 9, + VehicleClass.ClassP32DD, 13000 * 0.75), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 13000, 0, + VehicleClass.ClassP33SD, 14175), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 13000, 0, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 13000, 0, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 13000, 0, + VehicleClass.ClassP33SD, 13616), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 13000, 4, + VehicleClass.ClassP33DD, 14725), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 13000, 4, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 13000, 4, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 13000, 4, + VehicleClass.ClassP33DD, 14166), + ] + public void PrimaryBusCurbMassTest_LowTPMLM(VectoSimulationJobType jobType, ArchitectureID archId, + AxleConfiguration axleConfiguration, bool articulated, double TPMLM, int runIdx, + VehicleClass expectedVehicleClass, double expectedCurbMass) + { + PrimaryBusCurbMassTest(jobType, archId, axleConfiguration, articulated, TPMLM, runIdx, expectedVehicleClass, expectedCurbMass); + } + + private const VehicleCode VC_CA = VehicleCode.CA; + private const VehicleCode VC_CB = VehicleCode.CB; + private const VehicleCode VC_CE = VehicleCode.CE; + private const VehicleCode VC_CF = VehicleCode.CF; + private const RegistrationClass RC_II = RegistrationClass.II; + + [ + // testcases for vehicle mass with a high tpmlm + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 11975), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 12291), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 12291), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 11416), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 12350), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 12666), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 12666), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 11791), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13150), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13466), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13466), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 12229), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 25000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13400), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 25000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13716), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 25000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13716), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 25000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 12479), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 14175), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 25000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 13616), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 14725), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 25000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 14166), + ] + public void CompletedGenericBusCurbMassTest_HighTPMLM(VectoSimulationJobType jobType, ArchitectureID archId, + AxleConfiguration axleConfiguration, bool articulated, double TPMLM, int runIdx, + VehicleCode vehicleCode, RegistrationClass registrationClass, bool lowEntry, VehicleClass expectedVehicleClass, double expectedCurbMass) + { + CompletedGenericBusCurbMassTest(jobType, archId, axleConfiguration, articulated, TPMLM, runIdx, vehicleCode, registrationClass, lowEntry, expectedVehicleClass, expectedCurbMass); + } + + [ + // testcases for vehicle mass with a low tpmlm + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 13000 * 0.7), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 13000 * 0.7), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 13000 * 0.7), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP31SD, 13000 * 0.7), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 13000 * 0.7), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 13000 * 0.7), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 13000 * 0.7), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP31DD, 13000 * 0.7), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13000 * 0.75), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13000 * 0.75), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13000 * 0.75), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 7, VC_CA, RC_II, false, + VehicleClass.ClassP32SD, 13000 * 0.75), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl2, false, 13000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13000 * 0.75), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl2, false, 13000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13000 * 0.75), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl2, false, 13000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13000 * 0.75), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl2, false, 13000, 9, VC_CB, RC_II, false, + VehicleClass.ClassP32DD, 13000 * 0.75), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 14175), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 14491), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 13000, 0, VC_CE, RC_II, false, + VehicleClass.ClassP33SD, 13616), + + TestCase(VectoSimulationJobType.ConventionalVehicle, ArchitectureID.UNKNOWN, Axl3, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 14725), + TestCase(VectoSimulationJobType.SerialHybridVehicle, ArchitectureID.S2, Axl3, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P2, Axl3, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 15041), + TestCase(VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2, Axl3, false, 13000, 4, VC_CF, RC_II, false, + VehicleClass.ClassP33DD, 14166), + ] + public void CompletedGenericBusCurbMassTest_LowTPMLM(VectoSimulationJobType jobType, ArchitectureID archId, + AxleConfiguration axleConfiguration, bool articulated, double TPMLM, int runIdx, + VehicleCode vehicleCode, RegistrationClass registrationClass, bool lowEntry, VehicleClass expectedVehicleClass, double expectedCurbMass) + { + CompletedGenericBusCurbMassTest(jobType, archId, axleConfiguration, articulated, TPMLM, runIdx, vehicleCode, registrationClass, lowEntry, expectedVehicleClass, expectedCurbMass); + } + + public void PrimaryBusCurbMassTest(VectoSimulationJobType jobType, ArchitectureID archId, AxleConfiguration axleConfiguration, bool articulated, double TPMLM, int runIdx, VehicleClass expectedVehicleClass, double expectedCurbMass) + { + var addElectricComponents = false; + var input = new Mock<IDeclarationInputDataProvider>() + .PrimaryBus(); + switch (jobType) { + case VectoSimulationJobType.ConventionalVehicle: + input = input.Conventional(); + break; + case VectoSimulationJobType.ParallelHybridVehicle: + case VectoSimulationJobType.SerialHybridVehicle: + input = input.HEV(archId); + addElectricComponents = true; + break; + case VectoSimulationJobType.BatteryElectricVehicle: + input = input.PEV(archId); + addElectricComponents = true; + break; + default: + throw new Exception(); + } + + var result = _runDataFactoryFactory.CreateDeclarationRunDataFactory(input.Object, null, + null); + + var dataAdapter = (result as DeclarationModePrimaryBusRunDataFactory.PrimaryBusBase)?.DataAdapter; + Assert.NotNull(dataAdapter); + + var vehicleType = VehicleCategory.HeavyBusPrimaryVehicle; + + var segment = DeclarationData.PrimaryBusSegments.Lookup( + vehicleType, axleConfiguration, articulated); + + var mission = segment.Missions[runIdx]; + var vehicleInputData = GetMockVehicleData(TPMLM, axleConfiguration, addElectricComponents); + var vehicleData = + dataAdapter.CreateVehicleData(vehicleInputData, segment, mission, mission.Loadings.First(), false); + + Assert.AreEqual(expectedVehicleClass, mission.BusParameter.BusGroup); + Assert.AreEqual(expectedCurbMass, vehicleData.CurbMass.Value()); + } + + public void CompletedGenericBusCurbMassTest(VectoSimulationJobType jobType, ArchitectureID archId, + AxleConfiguration axleConfiguration, bool articulated, double TPMLM, int runIdx, + VehicleCode vehicleCode, + RegistrationClass registrationClass, bool lowEntry, + VehicleClass expectedVehicleClass, double expectedCurbMassGeneric) + { + var addElectricComponents = false; + var input = new Mock<IMultistageVIFInputData>() + .CompletedBus(); + switch (jobType) { + case VectoSimulationJobType.ConventionalVehicle: + input = input.Conventional(); + break; + case VectoSimulationJobType.ParallelHybridVehicle: + case VectoSimulationJobType.SerialHybridVehicle: + input = input.HEV(archId); + addElectricComponents = true; + break; + case VectoSimulationJobType.BatteryElectricVehicle: + input = input.PEV(archId); + addElectricComponents = true; + break; + default: + throw new Exception(); + } + + var result = _runDataFactoryFactory.CreateDeclarationRunDataFactory(input.Object, null, + null); + + var dataAdapterSpecific = (result as DeclarationModeCompletedBusRunDataFactory.CompletedBusBase)?.DataAdapterSpecific; + Assert.NotNull(dataAdapterSpecific); + + var dataAdapterGeneric = (result as DeclarationModeCompletedBusRunDataFactory.CompletedBusBase)?.DataAdapterGeneric; + Assert.NotNull(dataAdapterGeneric); + + var vehicleType = VehicleCategory.HeavyBusPrimaryVehicle; + + var primarySegment = DeclarationData.PrimaryBusSegments.Lookup( + vehicleType, axleConfiguration, articulated); + var completedSegment = DeclarationData.CompletedBusSegments.Lookup(axleConfiguration.NumAxles(), + vehicleCode, registrationClass, 10, 3.1.SI<Meter>(), lowEntry); + + var curbMassCompleted = 12345; + + var mission = primarySegment.Missions[runIdx]; + var completedMission = completedSegment.Missions.FirstOrDefault(m => m.MissionType == mission.MissionType); + var loading = mission.Loadings.First(); + var vehicleInputData = GetMockVehicleData(TPMLM, axleConfiguration, addElectricComponents); + var completedInput = GetMockCompletedInputData(curbMassCompleted); + + + var vehicleDataGeneric = + dataAdapterGeneric.CreateVehicleData(vehicleInputData, primarySegment, mission, loading, false); + var vehicleDataSpecific = + dataAdapterSpecific.CreateVehicleData(vehicleInputData, completedInput, completedSegment, completedMission, loading); + + Assert.AreEqual(expectedVehicleClass, mission.BusParameter.BusGroup); + Assert.AreEqual(expectedCurbMassGeneric, vehicleDataGeneric.CurbMass.Value()); + Assert.AreEqual(curbMassCompleted, vehicleDataSpecific.CurbMass.Value()); + } + + private IVehicleDeclarationInputData GetMockCompletedInputData(double curbMass) + { + var mock = new Mock<IVehicleDeclarationInputData>(); + mock.Setup(v => v.NumberPassengerSeatsLowerDeck).Returns(10); + mock.Setup(v => v.NumberPassengerSeatsUpperDeck).Returns(0); + mock.Setup(v => v.NumberPassengersStandingLowerDeck).Returns(0); + mock.Setup(v => v.NumberPassengersStandingUpperDeck).Returns(0); + mock.Setup(v => v.Length).Returns(8.SI<Meter>()); + mock.Setup(v => v.Width).Returns(2.55.SI<Meter>()); + mock.Setup(v => v.Height).Returns(3.5.SI<Meter>()); + mock.Setup(v => v.GrossVehicleMassRating).Returns(30000.SI<Kilogram>()); + mock.Setup(v => v.CurbMassChassis).Returns(curbMass.SI<Kilogram>()); + return mock.Object; + } + + + private IVehicleDeclarationInputData GetMockVehicleData(double tpmlm, AxleConfiguration axleConfiguration, bool addElectricComponents) + { + var mock = new Mock<IVehicleDeclarationInputData>(); + + var components = new Mock<IVehicleComponentsDeclaration>(); + mock.Setup(v => v.GrossVehicleMassRating).Returns(tpmlm.SI<Kilogram>()); + mock.Setup(v => v.Components).Returns(components.Object); + var axleWheels = new Mock<IAxlesDeclarationInputData>(); + components.Setup(c => c.AxleWheels).Returns(axleWheels.Object); + var axle1 = new Mock<IAxleDeclarationInputData>(); + + axle1.Setup(a => a.AxleType).Returns(AxleType.VehicleDriven); + var tyre = new Mock<ITyreDeclarationInputData>(); + axle1.Setup(a => a.Tyre).Returns(tyre.Object); + tyre.Setup(t => t.Dimension).Returns("275/70 R22.5"); + + var axles = new List<IAxleDeclarationInputData>() {axle1.Object}; + for (var i = 0; i < axleConfiguration.NumAxles(); i++) { + var axle = new Mock<IAxleDeclarationInputData>(); + axle.Setup(a => a.AxleType).Returns(AxleType.VehicleNonDriven); + axle.Setup(a => a.Tyre).Returns(tyre.Object); + axles.Add(axle.Object); + } + axleWheels.Setup(a => a.AxlesDeclaration).Returns(axles); + + var adas = new Mock<IAdvancedDriverAssistantSystemDeclarationInputData>(); + mock.Setup(v => v.ADAS).Returns(adas.Object); + adas.Setup(a => a.EcoRoll).Returns(EcoRollType.None); + adas.Setup(a => a.PredictiveCruiseControl).Returns(PredictiveCruiseControlType.None); + adas.Setup(a => a.EngineStopStart).Returns(false); + + if (!addElectricComponents) { + return mock.Object; + } + + var bat = new Mock<IBatteryPackDeclarationInputData>(); + var reess = new Mock<IElectricStorageSystemDeclarationInputData>(); + components.Setup(c => c.ElectricStorage).Returns(reess.Object); + reess.Setup(r => r.ElectricStorageElements).Returns(new[] { new ElectricStorageWrapper() { REESSPack = bat.Object} }.Cast<IElectricStorageDeclarationInputData>().ToList()); + + bat.Setup(m => m.MaxCurrentMap).Returns( + GetMockTableData(new[] { + new[]{"0.0", "100.0", "100.0"}, + new[]{"0.5", "100.0", "100.0"}, + new[]{"1.0", "100.0", "100.0"} + })); + + bat.Setup(m => m.InternalResistanceCurve).Returns( + GetMockTableData(new[] { + new[]{"0.0", "0.001"}, + new[]{"0.5", "0.001"}, + new[]{"1.0", "0.001"} + })); + bat.Setup(m => m.VoltageCurve).Returns( + GetMockTableData(new[] { + new[]{"0.0", "3000.0"}, + new[]{"0.5", "310.0"}, + new[]{"1.0", "320.0"} + })); + bat.Setup(b => b.Capacity).Returns(50.SI(Unit.SI.Ampere.Hour).Cast<AmpereSecond>()); + + var em = new Mock<IElectricMotorDeclarationInputData>(); + var ems = new Mock<IElectricMachinesDeclarationInputData>(); + ems.Setup(x => x.Entries) + .Returns(new[] { + new ElectricMachineEntry<IElectricMotorDeclarationInputData>() + { ElectricMachine = em.Object, Count = 1 } + }.ToList()); + var voltageLevel = new Mock<IElectricMotorVoltageLevel>(); + voltageLevel.SetupGet(x => x.ContinuousTorque).Returns(400.SI<NewtonMeter>()); + voltageLevel.SetupGet(x => x.ContinuousTorqueSpeed).Returns(2000.RPMtoRad()); + em.Setup(x => x.VoltageLevels).Returns(new[] { voltageLevel.Object }.ToList()); + components.Setup(c => c.ElectricMachines).Returns(ems.Object); + return mock.Object; + } + + public static TableData GetMockTableData(string[][] values) + { + var result = new TableData(); + + + foreach (var col in values.First()) { + result.Columns.Add(new DataColumn()); + } + + foreach (var row in values) { + result.Rows.Add(result.NewRow().ItemArray = row); + } + return result; + + } + } + + public class ElectricStorageWrapper : IElectricStorageDeclarationInputData + { + #region Implementation of IElectricStorageDeclarationInputData + + public IREESSPackInputData REESSPack { get; set; } + public int Count { get; set; } + public int StringId { get; set; } + + #endregion + } public static class AuxiliariesInputMockHelper diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusIgnoreResult.cs b/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusIgnoreResult.cs new file mode 100644 index 0000000000000000000000000000000000000000..69afd0390dfbb97cc49f4f3b0de297a22d0ab8c7 --- /dev/null +++ b/VectoCore/VectoCoreTest/Integration/Declaration/PrimaryBus/PrimaryBusIgnoreResult.cs @@ -0,0 +1,281 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Xml.Linq; +using System.Xml.XPath; +using Ninject; +using NUnit.Framework; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.FileIO.XML; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.OutputData; +using TUGraz.VectoCore.OutputData.FileIO; +using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Tests.Integration.Declaration.PrimaryBus; + +public class PrimaryBusIgnoreResult +{ + private const string BASE_DIR = @"TestData/Integration/DeclarationMode/2nd_AmendmDeclMode/"; + + private ThreadLocal<StandardKernel> _kernel; + + private StandardKernel Kernel => _kernel.Value; + + private IXMLInputDataReader _xmlReader; + + [OneTimeSetUp] + public void OneTimeSetup() + { + _kernel = new ThreadLocal<StandardKernel>(() => new StandardKernel(new VectoNinjectModule())); + _xmlReader = Kernel.Get<IXMLInputDataReader>(); + } + + [SetUp] + public void Setup() + { + Kernel.Rebind<IDeclarationCycleFactory>().To<TestDeclarationCycleFactoryVariant>().InSingletonScope(); + var cycleFactory = Kernel.Get<IDeclarationCycleFactory>() as TestDeclarationCycleFactoryVariant; + cycleFactory.Variant = "Short_1"; + + } + + private TestMissionFilter TestMissionFilter() + { + Kernel.Rebind<IMissionFilter>().To<TestMissionFilter>().InSingletonScope(); + var missionFilter = Kernel.Get<IMissionFilter>() as TestMissionFilter; + Assert.NotNull(missionFilter); + return missionFilter; + } + + [ + TestCase(@"PrimaryBus/Conventional/primary_heavyBus group41_nonSmart.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort Conventional"), + TestCase(@"PrimaryBus/P-HEV/PrimaryCoach_P2_HEV_Base_AMT.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort Coach P-HEV P2 Base AMT"), + TestCase(@"PrimaryBus/P-HEV/PrimaryCoach_P2_HEV_AMT_OVC.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort Coach P-HEV P2 AMT OVC"), + TestCase(@"FactorMethod/IEPC/P31_32_IEPC_EDP.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort FM IEPC EDP"), + TestCase(@"FactorMethod/IHPC/P31_32_IHPC_nonSmartES_mechAux.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort FM IHPC nonSmartES_mechAux"), + TestCase(@"PrimaryBus/PEV/PEV_primaryBus_AMT_E2.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort PEV E2"), + TestCase(@"PrimaryBus/PEV/PrimaryCityBus_IEPC_Base.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort CityBus PEV IEPC Base"), + TestCase(@"PrimaryBus/S-HEV/PrimaryCoach_S2_Base_AMT.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort Coach S-HEV S2 Base"), + TestCase(@"PrimaryBus/S-HEV/PrimaryCityBus_IEPC-S_Base.xml", 0, TestName = "2nd Amendment PrimaryBus IgnoreCycleAbort CityBus S-HEV IEPC Base"), + ] + public void PrimaryBusIgnoreCycleAbortTest(string jobFile, int runIdx) + { + TestMissionFilter().SetMissions((MissionType.Interurban, LoadingType.ReferenceLoad)); + RunSimulationPrimary(jobFile, runIdx); + } + + public void RunSimulationPrimary(string jobFile, int runIdx, params Action<VectoRunData>[] runDataModifier) + { + RunSimulationPrimary(jobFile, r => r.IterativeRunStrategy.Enabled = false); + } + + public void RunSimulationPrimary(string jobFile, params Action<VectoRunData>[] runDataModifier) + { + var filePath = Path.Combine(BASE_DIR, jobFile); + var outDir = Path.Combine(Path.GetDirectoryName(filePath), "IgnoreCycleAbort"); + if (!Directory.Exists(outDir)) { + Directory.CreateDirectory(outDir); + } + + var dataProvider = _xmlReader.CreateDeclaration(filePath); + var fileWriter = new FileOutputWriter(Path.Combine(outDir, Path.GetFileName(jobFile))); + var sumData = new SummaryDataContainer(fileWriter); + var simFactory = Kernel.Get<ISimulatorFactoryFactory>(); + var runsFactory = simFactory.Factory(ExecutionMode.Declaration, dataProvider, fileWriter, null, null); + runsFactory.WriteModalResults = false; + runsFactory.SerializeVectoRunData = false; + runsFactory.Validate = false; + runsFactory.SumData = sumData; + var jobContainer = new JobContainer(sumData) { }; + //var jobContainer = new JobContainer(new MockSumWriter()) { }; + var runs = runsFactory.SimulationRuns().ToList(); + foreach (var vectoRun in runs) { + foreach (var action in runDataModifier) { + action(vectoRun.GetContainer().RunData); + } + } + + var abortedRunIdx = runs.FindIndex(x => + x.GetContainer().RunData.Mission.BusParameter.DoubleDecker && + x.GetContainer().RunData.Loading == LoadingType.ReferenceLoad && + x.GetContainer().RunData.Mission.MissionType == MissionType.Interurban); + if (abortedRunIdx < 0) { + throw new Exception("No such simulation run found!"); + } + runs[abortedRunIdx] = new AbortingSimulationRun(runs[abortedRunIdx]); + + foreach (var run in runs) { + jobContainer.AddRun(run); + } + + jobContainer.Execute(); + jobContainer.WaitFinished(); + Assert.IsTrue(jobContainer.AllCompleted); + Assert.IsTrue(jobContainer.Runs.TrueForAll(runEntry => runEntry.Success)); + PrintFiles(fileWriter); + + AssertResultsAreNaN(fileWriter); + + } + + private void AssertResultsAreNaN(FileOutputWriter xmlFile) + { + var vifFileName = xmlFile.XMLPrimaryVehicleReportName; + var vifXML = XDocument.Load(vifFileName); + + var vifResults = vifXML.XPathSelectElements(".//*[local-name() = 'Result']"); + var ignoredVifResult = vifResults.FirstOrDefault(x => { + var subGroup = x.XPathSelectElement("./*[local-name()='PrimaryVehicleSubgroup']"); + var cycle = x.XPathSelectElement("./*[local-name()='Mission']"); + + return subGroup.Value.EndsWith("DD") && cycle.Value.Equals("Interurban"); + }); + + Assert.NotNull(ignoredVifResult); + Assert.AreEqual("success", ignoredVifResult.Attributes().First(a => a.Name.LocalName.Equals("status")).Value); + + var mrfFileName = xmlFile.XMLFullReportName; + var mrfXML = XDocument.Load(mrfFileName); + var mrfResults = mrfXML.XPathSelectElements(".//*[local-name() = 'Result']"); + var cycleVif = ignoredVifResult.XPathSelectElement("./*[local-name()='Mission']"); + var massVif = ignoredVifResult.XPathSelectElement(".//*[local-name()='TotalVehicleMass']"); + var ignoredMrfResult = mrfResults.FirstOrDefault(x => { + var cycle = x.XPathSelectElement("./*[local-name()='Mission']"); + var mass = x.XPathSelectElement(".//*[local-name()='TotalVehicleMass']"); + return cycle.Value.Equals(cycleVif.Value) && mass.Value.Equals(massVif.Value); + }); + + Assert.NotNull(ignoredMrfResult); + Assert.AreEqual("success", ignoredMrfResult.Attributes().First(a => a.Name.LocalName.Equals("status")).Value); + + var notANumberElements = new[] { + "FuelConsumption", "CO2", "EnergyConsumption", "UtilityFactor", "ActualChargeDepletingRange", "EquivalentAllElectricRange", + "ZeroCO2EmissionsRange", + "AverageSpeed", "AverageDrivingSpeed", "MinSpeed", "MaxSpeed", "MaxDeceleration", "MaxAcceleration" + }; + foreach (var node in new[] {ignoredVifResult, ignoredMrfResult}) { + var values = new List<Tuple<string, string, string>>(); + var hasOVCModes = node.XPathSelectElements(".//*[local-name() = 'OVCMode']").Any(); + foreach (var elementName in notANumberElements) { + var detailedSelector = hasOVCModes + ? " and ((ancestor-or-self::*[local-name() = 'OVCMode' and @type = 'charge depleting']) or ancestor-or-self::*[local-name()='Total'])" + : ""; + var queryString = $".//*[local-name() = '{elementName}'{detailedSelector}]"; + var result = node.XPathSelectElements(queryString); + foreach (var entry in result) { + //Assert.AreEqual(entry.Value, "NaN", $"elment ${elementName} expected to be NaN"); + var unit = entry.Attributes().FirstOrDefault(a => a.Name == "unit")?.Value; + values.Add(Tuple.Create(elementName, unit ?? "", entry.Value)); + } + } + + Assert.IsNotEmpty(values); + foreach (var entry in values) { + Assert.AreEqual("NaN", entry.Item3, $"element {entry.Item1} {entry.Item2} exptected to be NaN, {entry.Item3} found"); + } + } + + } + + public class AbortingSimulationRun : DistanceRun + { + private readonly IVectoRun _run; + + public AbortingSimulationRun(IVectoRun run) : base(run.GetContainer(), null, new IgnoreSimulationRun()) + { + _run = run; + } + + protected override IResponse DoSimulationStep() + { + IterationStatistics.StartIteration(); + + // estimate distance to be traveled within the next TargetTimeInterval + var ds = Container.VehicleInfo.VehicleSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.01.SI<MeterPerSecond>()) + ? Constants.SimulationSettings.DriveOffDistance + : VectoMath.Max( + Constants.SimulationSettings.TargetTimeInterval * Container.VehicleInfo.VehicleSpeed, + Constants.SimulationSettings.DriveOffDistance); + + var loopCount = 0; + IResponse response; + var debug = new DebugData(); + do { + IterationStatistics.Increment(this, "Iterations"); + + Container.Brakes.BrakePower = 0.SI<Watt>(); + response = CyclePort.Request(AbsTime, ds); + switch (response) { + case ResponseSuccess r: + dt = r.SimulationInterval; + break; + case ResponseDrivingCycleDistanceExceeded r: + if (r.MaxDistance.IsSmallerOrEqual(0)) { + throw new VectoSimulationException("DistanceExceeded, MaxDistance is invalid: {0}", r.MaxDistance); + } + ds = r.MaxDistance; + break; + case ResponseCycleFinished _: + FinishedWithoutErrors = true; + Log.Info("========= Driving Cycle Finished"); + break; + case ResponseBatteryEmpty _: + FinishedWithoutErrors = true; + Log.Info("========= REESS empty"); + break; + default: + throw new VectoException("DistanceRun got an unexpected response: {0}", response); + } + if (loopCount++ > Constants.SimulationSettings.MaximumIterationCountForSimulationStep) { + throw new VectoSimulationException("Maximum iteration count for a single simulation interval reached! Aborting!"); + } + + if (AbsTime > 100.SI<Second>()) { + throw new VectoException("Intentionally aborting the simulation run..."); + } + debug.Add($"[DR.DST-{loopCount}]", response); + } while (!(response is ResponseSuccess || response is ResponseCycleFinished || response is ResponseBatteryEmpty)); + + IterationStatistics.Increment(this, "Distance", Container.MileageCounter.Distance.Value()); + IterationStatistics.Increment(this, "Time", AbsTime.Value()); + IterationStatistics.FinishIteration(AbsTime); + response.AbsTime = AbsTime; + return response; + } + } + + public class IgnoreSimulationRun : IPostMortemAnalyzer + { + #region Implementation of IPostMortemAnalyzer + + public bool AbortSimulation(IVehicleContainer container, Exception ex) + { + // do not abort the simulation but ignore the result + container.RunStatus = VectoRun.Status.PrimaryBusSimulationIgnore; + return false; + } + + #endregion + } + + private void PrintFiles(FileOutputWriter fileWriter) + { + foreach (var keyValuePair in fileWriter.GetWrittenFiles()) { + TestContext.WriteLine($"{keyValuePair.Key} written to {keyValuePair.Value}"); + TestContext.AddTestAttachment(keyValuePair.Value, keyValuePair.Key.ToString()); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationAdapterCreateVocationalVehicleTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationAdapterCreateVocationalVehicleTest.cs index 169f6f2b96419dfb4a013bd52e5884dfefcb81bf..aff8f3b3c60afb3ae1fe149ef2d400e6cc8db1a4 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationAdapterCreateVocationalVehicleTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/DeclarationAdapterCreateVocationalVehicleTest.cs @@ -53,7 +53,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration.DataAdapter helper.AddNamespaces(manager); var vocational = nav.SelectSingleNode(XMLHelper.QueryLocalName(XMLNames.Component_Vehicle, XMLNames.Vehicle_VocationalVehicle)); - vocational.SetValue(true.ToString().ToLower()); + vocational.SetValue(true.ToString().ToLowerInvariant()); var modified = XmlReader.Create(new StringReader(nav.OuterXml)); var dataProvider = xmlInputReader.CreateDeclaration(modified);