From 126cdb4873a23867afe27f3b0131212f9e96e268 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Tue, 5 Apr 2022 16:49:04 +0200 Subject: [PATCH] adding testcases for different combinations of torque limitations (vehicle ICE limits, boosting limits, gearbox limits) --- ...ueReader.cs => MaxBoostingTorqueReader.cs} | 2 +- .../AbstractSimulationDataAdapter.cs | 61 +- .../EngineeringDataAdapter.cs | 99 ++- .../EngineeringModeVectoRunDataFactory.cs | 7 +- .../Data/HybridStrategyParameters.cs | 7 +- .../Data/VehicleMaxPropulsionTorque.cs | 4 +- .../Impl/HybridController.cs | 4 +- .../Strategies/HybridStrategy.cs | 34 +- .../Utils/DictionaryExtensionMethods.cs | 2 +- .../VectoCore/Utils/IterationStatistics.cs | 24 +- .../Integration/Hybrid/ParallelHybridTest.cs | 172 ++++- .../Utils/MockDeclarationVehicleInputData.cs | 2 +- .../Utils/MockSimulationDataFactory.cs | 22 + ...mary_heavyBus group42_SmartPS.RSLT_VIF.xml | 604 ------------------ 14 files changed, 345 insertions(+), 699 deletions(-) rename VectoCore/VectoCore/InputData/Reader/ComponentData/{MaxPropulsionTorqueReader.cs => MaxBoostingTorqueReader.cs} (97%) delete mode 100644 VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxPropulsionTorqueReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxBoostingTorqueReader.cs similarity index 97% rename from VectoCore/VectoCore/InputData/Reader/ComponentData/MaxPropulsionTorqueReader.cs rename to VectoCore/VectoCore/InputData/Reader/ComponentData/MaxBoostingTorqueReader.cs index 04059dc77a..2ecfeab1b8 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxPropulsionTorqueReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxBoostingTorqueReader.cs @@ -9,7 +9,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.ComponentData { - public static class MaxPropulsionTorqueReader + public static class MaxBoostingTorqueReader { public static VehicleMaxPropulsionTorque Read(Stream str) { diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index e83f1144be..ee158ff441 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -383,7 +383,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter /// <summary> - /// Intersects full load curves. + /// Intersects ICE full load curves. /// </summary> /// <param name="engineCurve"></param> /// <param name="maxTorque"></param> @@ -446,6 +446,65 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; return flc; } + + + /// <summary> + /// Intersects max torque curve. + /// </summary> + /// <param name="maxTorqueEntries"></param> + /// <param name="maxTorque"></param> + /// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns> + internal static IList<VehicleMaxPropulsionTorque.FullLoadEntry> IntersectMaxPropulsionTorqueCurve(IList<VehicleMaxPropulsionTorque.FullLoadEntry> maxTorqueEntries, NewtonMeter maxTorque) + { + if (maxTorque == null) { + return maxTorqueEntries; + } + + var entries = new List<VehicleMaxPropulsionTorque.FullLoadEntry>(); + var firstEntry = maxTorqueEntries.First(); + if (firstEntry.FullDriveTorque < maxTorque) { + entries.Add(maxTorqueEntries.First()); + } else { + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = firstEntry.MotorSpeed, + FullDriveTorque = maxTorque, + }); + } + foreach (var entry in maxTorqueEntries.Pairwise(Tuple.Create)) { + if (entry.Item1.FullDriveTorque <= maxTorque && entry.Item2.FullDriveTorque <= maxTorque) { + // segment is below maxTorque line -> use directly + entries.Add(entry.Item2); + } else if (entry.Item1.FullDriveTorque > maxTorque && entry.Item2.FullDriveTorque > maxTorque) { + // segment is above maxTorque line -> add limited entry + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = entry.Item2.MotorSpeed, + FullDriveTorque = maxTorque, + }); + } else { + // segment intersects maxTorque line -> add new entry at intersection + var edgeFull = Edge.Create( + new Point(entry.Item1.MotorSpeed.Value(), entry.Item1.FullDriveTorque.Value()), + new Point(entry.Item2.MotorSpeed.Value(), entry.Item2.FullDriveTorque.Value())); + + var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; + if (!entries.Any(x => x.MotorSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.MotorSpeed.Value())) { + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = intersectionX.SI<PerSecond>(), + FullDriveTorque = maxTorque, + }); + } + + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = entry.Item2.MotorSpeed, + FullDriveTorque = entry.Item2.FullDriveTorque > maxTorque ? maxTorque : entry.Item2.FullDriveTorque, + + }); + } + } + + + return entries; + } } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 72af4e3406..76c09a4f84 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -348,6 +348,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var gearData = new GearData { ShiftPolygon = shiftPolygon, MaxSpeed = gear.MaxInputSpeed, + MaxTorque = gear.MaxTorque, Ratio = gear.Ratio, LossMap = lossMap, }; @@ -995,13 +996,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } public HybridStrategyParameters CreateHybridStrategyParameters( - IHybridStrategyParameters hybridStrategyParameters, - TableData maxPropulsionTorque, CombustionEngineData combustionEngineData) + IEngineeringJobInputData jobInputData, + CombustionEngineData combustionEngineData, GearboxData gearboxData) { - VehicleMaxPropulsionTorque torqueLimit = maxPropulsionTorque == null - ? null - : CreateMaxPropulsionTorque(maxPropulsionTorque, combustionEngineData); + var hybridStrategyParameters = jobInputData.HybridStrategyParameters; + var torqueLimit = CreateMaxPropulsionTorque(jobInputData.Vehicle, combustionEngineData, gearboxData); + var retVal = new HybridStrategyParameters() { EquivalenceFactorDischarge = hybridStrategyParameters.EquivalenceFactorDischarge, EquivalenceFactorCharge = hybridStrategyParameters.EquivalenceFactorCharge, @@ -1019,34 +1020,74 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return retVal; } - private VehicleMaxPropulsionTorque CreateMaxPropulsionTorque(TableData maxPropulsionTorque, CombustionEngineData engineData) + protected internal static Dictionary<GearshiftPosition, VehicleMaxPropulsionTorque> CreateMaxPropulsionTorque(IVehicleEngineeringInputData vehicleInputData, CombustionEngineData engineData, GearboxData gearboxData) { - var offset = MaxPropulsionTorqueReader.Create(maxPropulsionTorque); - var belowIdle = offset.FullLoadEntries.Where(x => x.MotorSpeed < engineData.IdleSpeed).ToList(); - - var entries = belowIdle.Select(fullLoadEntry => new VehicleMaxPropulsionTorque.FullLoadEntry() - { MotorSpeed = fullLoadEntry.MotorSpeed, FullDriveTorque = fullLoadEntry.FullDriveTorque }) - .Concat( - engineData.FullLoadCurves[0].FullLoadEntries.Where(x => x.EngineSpeed > engineData.IdleSpeed) - .Select(fullLoadCurveEntry => + + // engine data contains full-load curves already cropped with max gearbox torque and max ICE torque (vehicle level) + + var maxBoostingTorque = vehicleInputData.BoostingLimitations; + var offset = maxBoostingTorque == null ? null : MaxBoostingTorqueReader.Create(maxBoostingTorque); + var belowIdle = offset?.FullLoadEntries.Where(x => x.MotorSpeed < engineData.IdleSpeed).ToList(); + + var retVal = new Dictionary<GearshiftPosition, VehicleMaxPropulsionTorque>(); + var isP1OrP2Hybrid = vehicleInputData.Components.ElectricMachines.Entries.Select(x => x.Position) + .Any(x => x == PowertrainPosition.HybridP1 || x == PowertrainPosition.HybridP2); + foreach (var key in engineData.FullLoadCurves.Keys) { + if (key == 0) { + continue; + } + if (maxBoostingTorque == null) { + if (gearboxData.Gears[key].MaxTorque == null) { + continue; + } + // don't know what to do... + // idea 1: apply gearbox limit for whole speed range + // idea 2: use em max torque as boosting limitation + var gbxLimit = new[] { + new VehicleMaxPropulsionTorque.FullLoadEntry() + { MotorSpeed = 0.RPMtoRad(), FullDriveTorque = gearboxData.Gears[key].MaxTorque }, + new VehicleMaxPropulsionTorque.FullLoadEntry() { + MotorSpeed = engineData.FullLoadCurves[0].N95hSpeed * 1.1, + FullDriveTorque = gearboxData.Gears[key].MaxTorque + } + }.ToList(); + retVal[new GearshiftPosition(key)] = new VehicleMaxPropulsionTorque(gbxLimit); + continue; + } + + // case boosting limit is defined, gearbox limit can be defined or not (handled in Intersect method) + + // entries contains ICE full-load curve with the boosting torque added. handles ICE speeds below idle + var entries = belowIdle.Select(fullLoadEntry => new VehicleMaxPropulsionTorque.FullLoadEntry() + { MotorSpeed = fullLoadEntry.MotorSpeed, FullDriveTorque = fullLoadEntry.FullDriveTorque }) + .Concat( + engineData.FullLoadCurves[key].FullLoadEntries.Where(x => x.EngineSpeed > engineData.IdleSpeed) + .Select(fullLoadCurveEntry => + new VehicleMaxPropulsionTorque.FullLoadEntry() { + MotorSpeed = fullLoadCurveEntry.EngineSpeed, + FullDriveTorque = fullLoadCurveEntry.TorqueFullLoad + + VectoMath.Max( + offset?.FullLoadDriveTorque(fullLoadCurveEntry.EngineSpeed), + 0.SI<NewtonMeter>()) + })) + .Concat( + new[] { engineData.IdleSpeed, engineData.IdleSpeed - 0.1.RPMtoRad() }.Select(x => new VehicleMaxPropulsionTorque.FullLoadEntry() { - MotorSpeed = fullLoadCurveEntry.EngineSpeed, - FullDriveTorque = fullLoadCurveEntry.TorqueFullLoad + - VectoMath.Max( - offset.FullLoadDriveTorque(fullLoadCurveEntry.EngineSpeed), + MotorSpeed = x, + FullDriveTorque = engineData.FullLoadCurves[0].FullLoadStationaryTorque(x) + + VectoMath.Max(offset?.FullLoadDriveTorque(x), 0.SI<NewtonMeter>()) })) - .Concat( - new[] { engineData.IdleSpeed, engineData.IdleSpeed - 0.1.RPMtoRad() }.Select(x => - new VehicleMaxPropulsionTorque.FullLoadEntry() { - MotorSpeed = x, - FullDriveTorque = engineData.FullLoadCurves[0].FullLoadStationaryTorque(x) + - VectoMath.Max(offset.FullLoadDriveTorque(x), - 0.SI<NewtonMeter>()) - })) - .OrderBy(x => x.MotorSpeed).ToList(); - - return new VehicleMaxPropulsionTorque(entries); + .OrderBy(x => x.MotorSpeed).ToList(); + + // if no gearbox limit is defined, MaxTorque is null; + // in case of P3 or P4, do not apply gearbox limit to propulsion limit as ICE is already cropped with max torque + var gearboxTorqueLimit = isP1OrP2Hybrid ? gearboxData.Gears[key].MaxTorque : null; + retVal[new GearshiftPosition(key)] = new VehicleMaxPropulsionTorque(IntersectMaxPropulsionTorqueCurve(entries, gearboxTorqueLimit)); + + } + + return retVal; } } } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index e40b9957e2..5afe571678 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -191,8 +191,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var vehicleData = dao.CreateVehicleData(vehicle); - var hybridParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters, - null, engineData); + var hybridParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData, + engineData, gearboxData); yield return new VectoRunData { JobName = InputDataProvider.JobInputData.JobName, JobType = jobType, @@ -412,8 +412,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } var hybridParameters = jobType == VectoSimulationJobType.ParallelHybridVehicle - ? dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters, - vehicle.BoostingLimitations, engineData) + ? dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData, engineData, gearboxData) : null; yield return new VectoRunData { JobName = InputDataProvider.JobInputData.JobName, diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs index 13b66e4008..8be989c132 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs @@ -1,5 +1,7 @@ -using TUGraz.VectoCommon.InputData; +using System.Collections.Generic; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public class HybridStrategyParameters @@ -20,7 +22,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public Second MinICEOnTime { get; set; } - public VehicleMaxPropulsionTorque MaxPropulsionTorque { get; set; } + public Dictionary<GearshiftPosition, VehicleMaxPropulsionTorque> MaxPropulsionTorque { get; set; } + public double ICEStartPenaltyFactor { get; set; } //public Watt MaxDrivetrainPower { get; set; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs index f95321dd4c..82dce7fb54 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs @@ -8,9 +8,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public class VehicleMaxPropulsionTorque { - internal readonly List<FullLoadEntry> FullLoadEntries; + internal readonly IList<FullLoadEntry> FullLoadEntries; - internal VehicleMaxPropulsionTorque(List<FullLoadEntry> entries) + internal VehicleMaxPropulsionTorque(IList<FullLoadEntry> entries) { FullLoadEntries = entries; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs index 606bba2cd7..069781313d 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs @@ -439,9 +439,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad; var reserve = 1 - response.Engine.TorqueOutDemand / fullLoadPower; - if (_runData != null && _runData.HybridStrategyParameters.MaxPropulsionTorque != null) { + if (_runData != null && _runData.HybridStrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(gear) != null) { var tqRequest = response.Gearbox.InputTorque; - var maxTorque = _runData.HybridStrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(response.Gearbox.InputSpeed); + var maxTorque = _runData.HybridStrategyParameters.MaxPropulsionTorque[gear].FullLoadDriveTorque(response.Gearbox.InputSpeed); reserve = 1 - VectoMath.Min(response.Engine.TorqueOutDemand / fullLoadPower, tqRequest / maxTorque); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index de58d4542d..aa1f6f5537 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -602,15 +602,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies public virtual IHybridStrategyResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun) { - - if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque != null && DataBus.GearboxInfo.TCLocked) { - var nextGear = DataBus.VehicleInfo.VehicleStopped + var nextGear = DataBus.VehicleInfo.VehicleStopped + ? Controller.ShiftStrategy.NextGear + : !DataBus.GearboxInfo.GearEngaged(absTime) ? Controller.ShiftStrategy.NextGear - : !DataBus.GearboxInfo.GearEngaged(absTime) - ? Controller.ShiftStrategy.NextGear - : PreviousState.GearboxEngaged - ? DataBus.GearboxInfo.Gear - : Controller.ShiftStrategy.NextGear; + : PreviousState.GearboxEngaged + ? DataBus.GearboxInfo.Gear + : Controller.ShiftStrategy.NextGear; + if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(nextGear) != null && DataBus.GearboxInfo.TCLocked) { + var emOff = new HybridStrategyResponse { CombustionEngineOn = DataBus.EngineInfo.EngineOn, // AllowICEOff(absTime), GearboxInNeutral = false, @@ -628,7 +628,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies if (testRequest.Gearbox.InputSpeed < DataBus.EngineInfo.EngineN95hSpeed) { var emPos = ModelData.ElectricMachinesData.First().Item1; var tqRequest = GetGearboxInTorqueLimitedVehiclePorpTorque(testRequest, emPos); //testRequest.Gearbox.InputTorque; - var maxTorque = StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); + var maxTorque = StrategyParameters.MaxPropulsionTorque[nextGear].FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); if (!dryRun) { CurrentState.MaxGbxTq = maxTorque; @@ -755,14 +755,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies // } //} - if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque != null) { + if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(response.Gearbox.Gear) != null) { var dryRunResponse = response as ResponseDryRun; if (response.Engine.EngineOn && dryRunResponse.DeltaFullLoad.IsSmallerOrEqual(0) && dryRunResponse.DeltaDragLoad.IsGreaterOrEqual(0) && LimitedGbxTorque) { // during this request the torque at gbx-in was limited - engine is ok and a seaerch operation is going on // overwrite delta value... var maxTorque = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(response.Gearbox.InputSpeed); + StrategyParameters.MaxPropulsionTorque[response.Gearbox.Gear].FullLoadDriveTorque(response.Gearbox.InputSpeed); var emPos = ModelData.ElectricMachinesData.First().Item1; @@ -871,7 +871,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var candidates = new Dictionary<GearshiftPosition, Tuple<Watt, IResponse>>(); var maxTorqueGbxIn = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(emOffResponse.Gearbox.InputSpeed); + StrategyParameters.MaxPropulsionTorque[gear].FullLoadDriveTorque(emOffResponse.Gearbox.InputSpeed); candidates[emOffResponse.Gearbox.Gear] = Tuple.Create(maxTorqueGbxIn * emOffResponse.Gearbox.InputSpeed, emOffResponse); foreach (var nextGear in GearList.IterateGears(firstGear, lastGear)) { if (candidates.ContainsKey(nextGear)) { @@ -892,8 +892,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } var testRequest = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, nextGear, emOff); if (testRequest != null && testRequest.Engine.EngineSpeed < ModelData.EngineData.FullLoadCurves[0].NTq99hSpeed) { - var maxGbxTorque = StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); - candidates[nextGear] = Tuple.Create(maxGbxTorque * testRequest.Gearbox.InputSpeed, testRequest); + var maxGbxTorque = StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(nextGear).FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); + candidates[nextGear] = maxGbxTorque != null + ? Tuple.Create(maxGbxTorque * testRequest.Gearbox.InputSpeed, testRequest) + : Tuple.Create(testRequest.Gearbox.InputTorque * testRequest.Gearbox.InputSpeed, testRequest); } } @@ -2153,10 +2155,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && - StrategyParameters.MaxPropulsionTorque != null) { + StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(resp.Gearbox.Gear) != null) { var tqRequest = resp.Gearbox.InputTorque; var maxTorque = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(resp.Gearbox.InputSpeed); + StrategyParameters.MaxPropulsionTorque[resp.Gearbox.Gear].FullLoadDriveTorque(resp.Gearbox.InputSpeed); if (((tqRequest - maxTorque) * resp.Gearbox.InputSpeed).IsGreater(0, Constants.SimulationSettings.LineSearchTolerance)) { tmp.IgnoreReason |= HybridConfigurationIgnoreReason.MaxPropulsionTorqueExceeded; } diff --git a/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs b/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs index f1f22de6c4..6a73586de1 100644 --- a/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs +++ b/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs @@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Utils { internal static class DictionaryExtensionMethods { - public static object GetValueOrNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) => + public static object GetValueOrDBNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) => dictionary.TryGetValue(key, out var value) ? (object)value : DBNull.Value; public static TValue GetValueOrZero<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) diff --git a/VectoCore/VectoCore/Utils/IterationStatistics.cs b/VectoCore/VectoCore/Utils/IterationStatistics.cs index 3668647971..48aa503560 100644 --- a/VectoCore/VectoCore/Utils/IterationStatistics.cs +++ b/VectoCore/VectoCore/Utils/IterationStatistics.cs @@ -106,24 +106,24 @@ namespace TUGraz.VectoCore.Utils row["StepDuration"] = entry.Duration.TotalMilliseconds; if (entry.Values.ContainsKey("DistanceRun")) { - row["Distance"] = entry.Values["DistanceRun"].GetValueOrNull("Distance"); - row["Time"] = entry.Values["DistanceRun"].GetValueOrNull("Time"); - row["StepIterationCount"] = entry.Values["DistanceRun"].GetValueOrNull("Iterations"); + row["Distance"] = entry.Values["DistanceRun"].GetValueOrDBNull("Distance"); + row["Time"] = entry.Values["DistanceRun"].GetValueOrDBNull("Time"); + row["StepIterationCount"] = entry.Values["DistanceRun"].GetValueOrDBNull("Iterations"); } if (entry.Values.ContainsKey("Driver")) { - row["NumDriverRequests"] = entry.Values["Driver"].GetValueOrNull("Requests"); - row["NumAccelActions"] = entry.Values["Driver"].GetValueOrNull("Accelerate"); - row["NumBrakeActions"] = entry.Values["Driver"].GetValueOrNull("Brake"); - row["NumCoastActions"] = entry.Values["Driver"].GetValueOrNull("Coast"); - row["NumRollActions"] = entry.Values["Driver"].GetValueOrNull("Roll"); - row["SearchOPIterations"] = entry.Values["Driver"].GetValueOrNull("SearchOperatingPoint"); - row["SearchBrakeIterations"] = entry.Values["Driver"].GetValueOrNull("SearchBrakingPower"); + row["NumDriverRequests"] = entry.Values["Driver"].GetValueOrDBNull("Requests"); + row["NumAccelActions"] = entry.Values["Driver"].GetValueOrDBNull("Accelerate"); + row["NumBrakeActions"] = entry.Values["Driver"].GetValueOrDBNull("Brake"); + row["NumCoastActions"] = entry.Values["Driver"].GetValueOrDBNull("Coast"); + row["NumRollActions"] = entry.Values["Driver"].GetValueOrDBNull("Roll"); + row["SearchOPIterations"] = entry.Values["Driver"].GetValueOrDBNull("SearchOperatingPoint"); + row["SearchBrakeIterations"] = entry.Values["Driver"].GetValueOrDBNull("SearchBrakingPower"); } if (entry.Values.ContainsKey("Gearbox")) { - row["NumGearboxRequests"] = entry.Values["Gearbox"].GetValueOrNull("Requests"); + row["NumGearboxRequests"] = entry.Values["Gearbox"].GetValueOrDBNull("Requests"); } if (entry.Values.ContainsKey("CombustionEngine")) { - row["NumEngineRequests"] = entry.Values["CombustionEngine"].GetValueOrNull("Requests"); + row["NumEngineRequests"] = entry.Values["CombustionEngine"].GetValueOrDBNull("Requests"); } table.Rows.Add(row); } diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs index 980ee319ed..e8c402f291 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs @@ -10,6 +10,7 @@ using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.Impl; using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.InputData.Reader.Impl; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; @@ -315,7 +316,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); var cycleData = string.Format( @" 0, 0, {1}, 3 - 700, {0}, {1}, 0", vmax, slope); + 1200, {0}, {1}, 0", vmax, slope); var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}.vmod"; @@ -338,23 +339,121 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid graphWriter.Write(modFilename); } + [ + TestCase(80, 0.7, 5, TestName = "P2 Hybrid GbxTqLimit DriveOff 80km/h SoC: 0.7, UH 5%"), + ] + public void P2HybridDriveOffGbxTqLimit(double vmax, double initialSoC, double slope) + { + var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 1200, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_gbxLimit-2300.vmod"; + const PowertrainPosition pos = PowertrainPosition.HybridP2; + var job = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, maxGearboxTorque: 2370.SI<NewtonMeter>()); + var run = job.Runs.First().Run; + + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + Assert.NotNull(hybridController); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + graphWriter.Write(modFilename); + } [ - TestCase(80, 0.7, 5, 320, TestName = "P2 Hybrid DriveOff 80km/h SoC: 0.7, UH 5% MaxPWR: 320kW"), - + TestCase(80, 0.7, 5, 0, TestName = "P2 Hybrid BoostingLimit 0Nm DriveOff 80km/h SoC: 0.7, UH 5%"), + TestCase(80, 0.7, 5, 100, TestName = "P2 Hybrid BoostingLimit 100Nm DriveOff 80km/h SoC: 0.7, UH 5%"), ] - public void P2HybridDriveOffLimitPwr(double vmax, double initialSoC, double slope, double maxPwrkW) + public void P2HybridDriveOffBoostingLimitLimit(double vmax, double initialSoC, double slope, double boostingLimit) { var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); var cycleData = string.Format( @" 0, 0, {1}, 3 - 700, {0}, {1}, 0", vmax, slope); + 1200, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_boostingLimit-{boostingLimit}.vmod"; + const PowertrainPosition pos = PowertrainPosition.HybridP2; + var job = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, boostingLimit: boostingLimit.SI<NewtonMeter>()); + var run = job.Runs.First().Run; + + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + Assert.NotNull(hybridController); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + graphWriter.Write(modFilename); + } + + + [ + TestCase(80, 0.7, 5, 100, TestName = "P2 Hybrid BoostingAndGbxLimit 150Nm DriveOff 80km/h SoC: 0.7, UH 5%"), + ] + public void P2HybridDriveOffBoostingAndGbxLimit(double vmax, double initialSoC, double slope, double boostingLimit) + { + var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 1200, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_boostingAndGbxLimit-{boostingLimit}.vmod"; + const PowertrainPosition pos = PowertrainPosition.HybridP2; + var job = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, boostingLimit: boostingLimit.SI<NewtonMeter>(), maxGearboxTorque: 2370.SI<NewtonMeter>()); + var run = job.Runs.First().Run; + + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + Assert.NotNull(hybridController); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + graphWriter.Write(modFilename); + } + + [ + TestCase(80, 0.7, 5, 100, TestName = "P2 Hybrid BoostingAndGbxLimit TopTorque 150Nm DriveOff 80km/h SoC: 0.7, UH 5%"), + ] + public void P2HybridDriveOffBoostingAndGbxLimitTopTorque(double vmax, double initialSoC, double slope, double boostingLimit) + { + var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 1200, {0}, {1}, 0 + 1201, {0}, {2}, 0 + 2000, {0}, {2}, 0", vmax, slope, 7.2); var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); - var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_maxPwr-{maxPwrkW}.vmod"; + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_boostingAndGbxLimitTopTorque-{boostingLimit}.vmod"; const PowertrainPosition pos = PowertrainPosition.HybridP2; var job = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, maxDriveTrainPower: (maxPwrkW * 1000).SI<Watt>()); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, + boostingLimit: boostingLimit.SI<NewtonMeter>(), maxGearboxTorque: 2370.SI<NewtonMeter>(), + topTorque: 2000.SI<NewtonMeter>()); + var run = job.Runs.First().Run; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; @@ -545,16 +644,16 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid TestCase(Group5TestJob, 9, TestName = "P2 Hybrid Group 5 DriveCycle UrbanDelivery"), ] [ - TestCase(Group5TestJob_GbxTqLimit, 0, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle LongHaul"), - TestCase(Group5TestJob_GbxTqLimit, 1, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle Coach"), - TestCase(Group5TestJob_GbxTqLimit, 2, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle Construction"), - TestCase(Group5TestJob_GbxTqLimit, 3, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle HeavyUrban"), - TestCase(Group5TestJob_GbxTqLimit, 4, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle Interurban"), - TestCase(Group5TestJob_GbxTqLimit, 5, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle MunicipalUtility"), - TestCase(Group5TestJob_GbxTqLimit, 6, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle RegionalDelivery"), - TestCase(Group5TestJob_GbxTqLimit, 7, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle Suburban"), - TestCase(Group5TestJob_GbxTqLimit, 8, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle Urban"), - TestCase(Group5TestJob_GbxTqLimit, 9, TestName = "P2 Hybrid Group 5 TbxTqLimit DriveCycle UrbanDelivery"), + TestCase(Group5TestJob_GbxTqLimit, 0, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle LongHaul"), + TestCase(Group5TestJob_GbxTqLimit, 1, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Coach"), + TestCase(Group5TestJob_GbxTqLimit, 2, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Construction"), + TestCase(Group5TestJob_GbxTqLimit, 3, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle HeavyUrban"), + TestCase(Group5TestJob_GbxTqLimit, 4, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Interurban"), + TestCase(Group5TestJob_GbxTqLimit, 5, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle MunicipalUtility"), + TestCase(Group5TestJob_GbxTqLimit, 6, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle RegionalDelivery"), + TestCase(Group5TestJob_GbxTqLimit, 7, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Suburban"), + TestCase(Group5TestJob_GbxTqLimit, 8, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Urban"), + TestCase(Group5TestJob_GbxTqLimit, 9, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle UrbanDelivery"), ] public void P2HybridGroup5DriveCycle(string jobFile, int cycleIdx) { RunHybridJob(jobFile, cycleIdx); } @@ -1384,14 +1483,14 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid public static JobContainer CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, double ratio, bool largeMotor = false, double pAuxEl = 0, - Kilogram payload = null, Watt maxDriveTrainPower = null, GearboxType gearboxType = GearboxType.NoGearbox) + Kilogram payload = null, GearboxType gearboxType = GearboxType.NoGearbox, + NewtonMeter maxGearboxTorque = null, NewtonMeter boostingLimit = null, NewtonMeter topTorque = null) { var fileWriter = new FileOutputWriter(Path.GetFileNameWithoutExtension(modFileName)); var sumData = new SummaryDataContainer(fileWriter); var jobContainer = new JobContainer(sumData); var container = CreateParallelHybridPowerTrain( - cycleData, modFileName, initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload, - maxDriveTrainPower, gearboxType); + cycleData, modFileName, initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload, gearboxType, maxGearboxTorque, boostingLimit, topTorque); var run = new DistanceRun(container); jobContainer.AddRun(run); return jobContainer; @@ -1407,7 +1506,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid public static VehicleContainer CreateParallelHybridPowerTrain(DrivingCycleData cycleData, string modFileName, double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, - PowertrainPosition pos, double ratio, Kilogram payload = null, Watt maxDriveTrainPower = null, GearboxType gearboxType = GearboxType.NoGearbox) + PowertrainPosition pos, double ratio, Kilogram payload = null, + GearboxType gearboxType = GearboxType.NoGearbox, NewtonMeter maxGearboxTorque = null, + NewtonMeter boostingLimit = null, NewtonMeter topTorque = null) { var gearboxData = CreateGearboxData(gearboxType); var axleGearData = CreateAxleGearData(gearboxType); @@ -1424,7 +1525,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid //batteryData.TargetSoC = 0.5; var engineData = MockSimulationDataFactory.CreateEngineDataFromFile( - Truck40tPowerTrain.EngineFile, gearboxData.Gears.Count); + Truck40tPowerTrain.EngineFile, gearboxData.Gears.Count, topTorque); foreach (var entry in gearboxData.Gears) { entry.Value.ShiftPolygon = DeclarationData.Gearbox.ComputeEfficiencyShiftPolygon( @@ -1449,9 +1550,32 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid EngineData = engineData, BatteryData = batteryData, GearshiftParameters = CreateGearshiftData(gearboxData, axleGearData.AxleGear.Ratio, engineData.IdleSpeed), - HybridStrategyParameters = CreateHybridStrategyData(maxDriveTrainPower), + HybridStrategyParameters = CreateHybridStrategyData(), ElectricAuxDemand = pAuxEl.SI<Watt>() }; + var mockVehicleInput = new MockEngineeringVehicleInputData() { }; + mockVehicleInput.ElectricMachines = new MockElectricMachinesInputData() { + Entries = new List<ElectricMachineEntry<IElectricMotorEngineeringInputData>>() { + new ElectricMachineEntry<IElectricMotorEngineeringInputData>() { + Position = pos + } + } + }; + if (boostingLimit != null) { + mockVehicleInput.BoostingLimitations = VectoCSVFile.ReadStream( + $"n, T_drive\n0, {boostingLimit.Value()}\n1000, {boostingLimit.Value()}".ToStream()); + runData.HybridStrategyParameters.MaxPropulsionTorque = + EngineeringDataAdapter.CreateMaxPropulsionTorque(mockVehicleInput, engineData, + gearboxData); + } + if (maxGearboxTorque != null) { + foreach (var gear in gearboxData.Gears) { + gear.Value.MaxTorque = maxGearboxTorque; + } + runData.HybridStrategyParameters.MaxPropulsionTorque = + EngineeringDataAdapter.CreateMaxPropulsionTorque(mockVehicleInput, engineData, + gearboxData); + } var fileWriter = new FileOutputWriter(modFileName); var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), }; var modData = new ModalDataContainer(runData, fileWriter, null, modDataFilter) @@ -1522,7 +1646,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid return container; } - private static HybridStrategyParameters CreateHybridStrategyData(Watt maxDriveTrainPower) + private static HybridStrategyParameters CreateHybridStrategyData() { return new HybridStrategyParameters() { EquivalenceFactorDischarge = 2.5, diff --git a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs index be422960bd..afee0cfbe7 100644 --- a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs +++ b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs @@ -119,7 +119,7 @@ namespace TUGraz.VectoCore.Tests.Utils public bool Articulated { get; } public Meter Height { get; } public TableData ElectricMotorTorqueLimits { get; } - public TableData BoostingLimitations { get; } + public TableData BoostingLimitations { get; set; } public Meter Length { get; set; } public Meter Width { get; set; } public Meter EntranceHeight { get; } diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs index 3c89b0fe24..89cb4aa357 100644 --- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs +++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs @@ -151,6 +151,26 @@ namespace TUGraz.VectoCore.Tests.Utils return engineData; } + public static CombustionEngineData CreateEngineDataFromFile(string engineFile, int numGears, NewtonMeter topTorque) + { + var dao = new EngineeringDataAdapter(); + var engineInput = JSONInputDataFactory.ReadEngine(engineFile); + var vehicleInput = new MockEngineeringVehicleInputData() { + EngineInputData = engineInput, + }; + var engineData = dao.CreateEngineData(vehicleInput, engineInput.EngineModes.First()); + for (uint i = 1; i <= numGears; i++) { + if (i < numGears) { + engineData.FullLoadCurves[i] = + AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineData.FullLoadCurves[0], topTorque); + } else { + engineData.FullLoadCurves[i] = engineData.FullLoadCurves[0]; + } + } + + return engineData; + } + public static VehicleData CreateVehicleDataFromFile(string vehicleDataFile) { var dao = new EngineeringDataAdapter(); @@ -199,6 +219,8 @@ namespace TUGraz.VectoCore.Tests.Utils var inputData = JSONInputDataFactory.ReadREESSData(file, false); return new EngineeringDataAdapter().CreateBatteryData(new MockBatteryInputData() {REESSPack = inputData}, initialSoC); } + + } public class MockComponentsTest : IVehicleComponentsDeclaration diff --git a/VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml b/VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml deleted file mode 100644 index c953f42917..0000000000 --- a/VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml +++ /dev/null @@ -1,604 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<VectoOutputMultistep xmlns:di="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" xmlns:v2.8="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1 V:\VectoCore\VectoCore\Resources\XSD/VectoOutputMultistep.0.1.xsd" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1"> - <PrimaryVehicle> - <Data id="VEH-bce95de06ff54c85bca9" xsi:type="PrimaryVehicleDataType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1"> - <Vehicle xsi:type="VehiclePIFType"> - <ManufacturerPrimaryVehicle>Generic Truck Manufacturer</ManufacturerPrimaryVehicle> - <ManufacturerAddressPrimaryVehicle>Street, ZIP City</ManufacturerAddressPrimaryVehicle> - <Model>Generic Model Primary</Model> - <VIN>VEH-1234567890_SmartPS</VIN> - <Date>2017-02-15T11:00:00Z</Date> - <LegislativeCategory>M3</LegislativeCategory> - <ChassisConfiguration>Bus</ChassisConfiguration> - <AxleConfiguration>6x2</AxleConfiguration> - <Articulated>false</Articulated> - <TechnicalPermissibleMaximumLadenMass>25000</TechnicalPermissibleMaximumLadenMass> - <IdlingSpeed>600</IdlingSpeed> - <RetarderType>Transmission Output Retarder</RetarderType> - <RetarderRatio>1.000</RetarderRatio> - <AngledriveType>None</AngledriveType> - <ZeroEmissionVehicle>false</ZeroEmissionVehicle> - <vif0.1:ADAS xsi:type="ADAS_Conventional_Type" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4"> - <EngineStopStart>false</EngineStopStart> - <EcoRollWithoutEngineStop>false</EcoRollWithoutEngineStop> - <EcoRollWithEngineStop>false</EcoRollWithEngineStop> - <PredictiveCruiseControl>none</PredictiveCruiseControl> - </vif0.1:ADAS> - <vif0.1:TorqueLimits xsi:type="TorqueLimitsType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0"> - <Entry gear="6" maxTorque="1800" /> - <Entry gear="1" maxTorque="2500" /> - <Entry gear="12" maxTorque="1900" /> - </vif0.1:TorqueLimits> - <Components xsi:type="VehicleComponentsPIFType"> - <Engine> - <Data xsi:type="EngineDataPIFType"> - <Manufacturer>Generic Engine Manufacturer Primary</Manufacturer> - <Model>Bus 6x2 Engine</Model> - <CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber> - <Date>2017-02-15T11:00:00Z</Date> - <AppVersion>VectoEngine x.y</AppVersion> - <Displacement>12730</Displacement> - <RatedSpeed>1800</RatedSpeed> - <RatedPower>325032</RatedPower> - <MaxEngineTorque>2134</MaxEngineTorque> - <WHRType> - <v2.3:MechanicalOutputICE>false</v2.3:MechanicalOutputICE> - <v2.3:MechanicalOutputDrivetrain>false</v2.3:MechanicalOutputDrivetrain> - <v2.3:ElectricalOutput>false</v2.3:ElectricalOutput> - </WHRType> - <Mode> - <IdlingSpeed>600</IdlingSpeed> - <FullLoadAndDragCurve> - <Entry engineSpeed="600.00" maxTorque="1188.00" dragTorque="-138.00" /> - <Entry engineSpeed="800.00" maxTorque="1661.00" dragTorque="-143.00" /> - <Entry engineSpeed="1000.00" maxTorque="2134.00" dragTorque="-152.00" /> - <Entry engineSpeed="1200.00" maxTorque="2134.00" dragTorque="-165.00" /> - <Entry engineSpeed="1400.00" maxTorque="2134.00" dragTorque="-187.00" /> - <Entry engineSpeed="1600.00" maxTorque="1928.00" dragTorque="-217.00" /> - <Entry engineSpeed="1800.00" maxTorque="1722.00" dragTorque="-244.00" /> - <Entry engineSpeed="2000.00" maxTorque="1253.00" dragTorque="-278.00" /> - <Entry engineSpeed="2100.00" maxTorque="1019.00" dragTorque="-296.00" /> - <Entry engineSpeed="2200.00" maxTorque="0.00" dragTorque="-314.00" /> - </FullLoadAndDragCurve> - <Fuels> - <FuelType>Diesel CI</FuelType> - </Fuels> - </Mode> - </Data> - </Engine> - <Transmission> - <Data xsi:type="TransmissionDataPIFType"> - <Manufacturer>Generic Gearbox Manufacturer Primary</Manufacturer> - <Model>Generic 40t Long Haul Truck Gearbox Primary</Model> - <MainCertificationMethod>Standard values</MainCertificationMethod> - <Date>2017-01-11T11:00:00Z</Date> - <AppVersion>3.0.1</AppVersion> - <TransmissionType>AMT</TransmissionType> - <Gears xsi:type="TransmissionGearsPIFType"> - <Gear number="1"> - <Ratio>14.930</Ratio> - <MaxTorque>1900</MaxTorque> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="2"> - <Ratio>11.640</Ratio> - <MaxTorque>1900</MaxTorque> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="3"> - <Ratio>9.020</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="4"> - <Ratio>7.040</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="5"> - <Ratio>5.640</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="6"> - <Ratio>4.400</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="7"> - <Ratio>3.390</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="8"> - <Ratio>2.650</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="9"> - <Ratio>2.050</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="10"> - <Ratio>1.600</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="11"> - <Ratio>1.280</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="12"> - <Ratio>1.000</Ratio> - </Gear> - </Gears> - </Data> - </Transmission> - <Axlegear> - <Data xsi:type="AxlegearDataPIFType"> - <Manufacturer>Generic Gearbox Manufacturer</Manufacturer> - <Model>Generic 40t Long Haul Truck AxleGear Primary</Model> - <CertificationMethod>Standard values</CertificationMethod> - <Date>2017-01-11T11:00:00Z</Date> - <AppVersion>3.0.1</AppVersion> - <LineType>Single portal axle</LineType> - <Ratio>2.590</Ratio> - </Data> - </Axlegear> - <AxleWheels> - <Data xsi:type="AxleWheelsDataPIFType"> - <Axles> - <Axle axleNumber="1" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="v2.0:AxleDataDeclarationType"> - <v2.0:AxleType>VehicleNonDriven</v2.0:AxleType> - <v2.0:TwinTyres>false</v2.0:TwinTyres> - <v2.0:Steered>true</v2.0:Steered> - <v2.0:Tyre> - <v2.0:Data id="WHL-5432198760-315-70-R22.5" xsi:type="v2.0:TyreDataDeclarationType"> - <v2.0:Manufacturer>Generic Wheels Manufacturer</v2.0:Manufacturer> - <v2.0:Model>Generic Wheel</v2.0:Model> - <v2.0:CertificationNumber>e12*0815/8051*2017/05E0000*00</v2.0:CertificationNumber> - <v2.0:Date>2017-01-11T14:00:00Z</v2.0:Date> - <v2.0:AppVersion>Tyre Generation App 1.0</v2.0:AppVersion> - <v2.0:Dimension>315/70 R22.5</v2.0:Dimension> - <v2.0:RRCDeclared>0.0055</v2.0:RRCDeclared> - <v2.0:FzISO>31300</v2.0:FzISO> - </v2.0:Data> - <v2.0:Signature> - <di:Reference URI="#WHL-5432198760-315-70-R22.5" xmlns:di="http://www.w3.org/2000/09/xmldsig#"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>4TkUGQTX8tevHOU9Cj9uyCFuI/aqcEYlo/gyVjVQmv0=</di:DigestValue> - </di:Reference> - </v2.0:Signature> - </v2.0:Tyre> - </Axle> - <Axle axleNumber="2" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="v2.0:AxleDataDeclarationType"> - <v2.0:AxleType>VehicleDriven</v2.0:AxleType> - <v2.0:TwinTyres>true</v2.0:TwinTyres> - <v2.0:Steered>false</v2.0:Steered> - <v2.0:Tyre> - <v2.0:Data id="WHL-5432198760-315-70-R22.5" xsi:type="v2.0:TyreDataDeclarationType"> - <v2.0:Manufacturer>Generic Wheels Manufacturer</v2.0:Manufacturer> - <v2.0:Model>Generic Wheel</v2.0:Model> - <v2.0:CertificationNumber>e12*0815/8051*2017/05E0000*00</v2.0:CertificationNumber> - <v2.0:Date>2017-01-11T14:00:00Z</v2.0:Date> - <v2.0:AppVersion>Tyre Generation App 1.0</v2.0:AppVersion> - <v2.0:Dimension>315/70 R22.5</v2.0:Dimension> - <v2.0:RRCDeclared>0.0063</v2.0:RRCDeclared> - <v2.0:FzISO>31300</v2.0:FzISO> - </v2.0:Data> - <v2.0:Signature> - <di:Reference URI="#WHL-5432198760-315-70-R22.5" xmlns:di="http://www.w3.org/2000/09/xmldsig#"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>KljvtvGUUQ/L7MiLVAqU+bckL5PNDNNwdeLH9kUVrfM=</di:DigestValue> - </di:Reference> - </v2.0:Signature> - </v2.0:Tyre> - </Axle> - <Axle axleNumber="3" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="v2.0:AxleDataDeclarationType"> - <v2.0:AxleType>VehicleNonDriven</v2.0:AxleType> - <v2.0:TwinTyres>false</v2.0:TwinTyres> - <v2.0:Steered>false</v2.0:Steered> - <v2.0:Tyre> - <v2.0:Data id="WHL-5432198760-315-70-R22.5" xsi:type="v2.0:TyreDataDeclarationType"> - <v2.0:Manufacturer>Generic Wheels Manufacturer</v2.0:Manufacturer> - <v2.0:Model>Generic Wheel</v2.0:Model> - <v2.0:CertificationNumber>e12*0815/8051*2017/05E0000*00</v2.0:CertificationNumber> - <v2.0:Date>2017-01-11T14:00:00Z</v2.0:Date> - <v2.0:AppVersion>Tyre Generation App 1.0</v2.0:AppVersion> - <v2.0:Dimension>315/70 R22.5</v2.0:Dimension> - <v2.0:RRCDeclared>0.0055</v2.0:RRCDeclared> - <v2.0:FzISO>31300</v2.0:FzISO> - </v2.0:Data> - <v2.0:Signature> - <di:Reference URI="#WHL-5432198760-315-70-R22.5" xmlns:di="http://www.w3.org/2000/09/xmldsig#"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>4TkUGQTX8tevHOU9Cj9uyCFuI/aqcEYlo/gyVjVQmv0=</di:DigestValue> - </di:Reference> - </v2.0:Signature> - </v2.0:Tyre> - </Axle> - </Axles> - </Data> - </AxleWheels> - <Auxiliaries> - <Data xsi:type="AuxiliaryDataPIFType"> - <Fan> - <Technology>Hydraulic driven - Constant displacement pump</Technology> - </Fan> - <SteeringPump> - <Technology axleNumber="1">Variable displacement elec. controlled</Technology> - </SteeringPump> - <ElectricSystem> - <AlternatorTechnology>conventional</AlternatorTechnology> - </ElectricSystem> - <PneumaticSystem> - <SizeOfAirSupply>Large Supply 2-stage</SizeOfAirSupply> - <CompressorDrive>electrically</CompressorDrive> - <Clutch>none</Clutch> - <CompressorRatio>1.000</CompressorRatio> - <SmartCompressionSystem>true</SmartCompressionSystem> - <SmartRegenerationSystem>false</SmartRegenerationSystem> - <AirsuspensionControl>electronically</AirsuspensionControl> - <PneumaticSCRReagentDosing>true</PneumaticSCRReagentDosing> - </PneumaticSystem> - <HVAC> - <AdjustableCoolantThermostat>true</AdjustableCoolantThermostat> - <EngineWasteGasHeatExchanger>true</EngineWasteGasHeatExchanger> - </HVAC> - </Data> - </Auxiliaries> - </Components> - </Vehicle> - <InputDataSignature> - <di:Reference URI="#VEH-PrimaryBus_SmartPS"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>JKmEGO5ChZ+EWf9fu/yxJQldo/kvXaJnmhgcz2YQTpU=</di:DigestValue> - </di:Reference> - </InputDataSignature> - <ManufacturerRecordSignature> - <di:Reference URI="#RESULT-75ce50bbcc114a1a8fa8"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>nFutXxdSkqt7h2WAMbnJuL50CjfABdvcu9V30e0y1NI=</di:DigestValue> - </di:Reference> - </ManufacturerRecordSignature> - <Results> - <Status>success</Status> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15527.52</TotalVehicleMass> - <Payload unit="kg">1352.52</Payload> - <PassengerCount>19.89</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">21.18710</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1553.06</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">20937.60</TotalVehicleMass> - <Payload unit="kg">6762.60</Payload> - <PassengerCount>99.45</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">25.36235</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1859.11</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15527.52</TotalVehicleMass> - <Payload unit="kg">1352.52</Payload> - <PassengerCount>19.89</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">16.73089</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1226.41</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">20937.60</TotalVehicleMass> - <Payload unit="kg">6762.60</Payload> - <PassengerCount>99.45</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">20.22898</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1482.83</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15527.52</TotalVehicleMass> - <Payload unit="kg">1352.52</Payload> - <PassengerCount>19.89</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">14.37825</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1053.96</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">20937.60</TotalVehicleMass> - <Payload unit="kg">6762.60</Payload> - <PassengerCount>99.45</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">17.62230</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1291.75</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15469.51</TotalVehicleMass> - <Payload unit="kg">1294.51</Payload> - <PassengerCount>18.23</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">11.83195</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">867.31</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">18411.57</TotalVehicleMass> - <Payload unit="kg">4236.57</Payload> - <PassengerCount>59.67</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">13.25049</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">971.29</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16303.29</TotalVehicleMass> - <Payload unit="kg">1578.29</Payload> - <PassengerCount>23.21</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">22.69048</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1663.26</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22616.43</TotalVehicleMass> - <Payload unit="kg">7891.43</Payload> - <PassengerCount>116.05</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">27.91380</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">2046.14</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16303.29</TotalVehicleMass> - <Payload unit="kg">1578.29</Payload> - <PassengerCount>23.21</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">17.89886</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1312.02</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22616.43</TotalVehicleMass> - <Payload unit="kg">7891.43</Payload> - <PassengerCount>116.05</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">22.22866</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1629.41</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16303.29</TotalVehicleMass> - <Payload unit="kg">1578.29</Payload> - <PassengerCount>23.21</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">15.31725</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1122.79</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22616.43</TotalVehicleMass> - <Payload unit="kg">7891.43</Payload> - <PassengerCount>116.05</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">19.28148</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1413.37</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16467.68</TotalVehicleMass> - <Payload unit="kg">1254.68</Payload> - <PassengerCount>17.67</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">11.94624</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">875.68</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">19319.21</TotalVehicleMass> - <Payload unit="kg">4106.21</Payload> - <PassengerCount>57.83</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">13.32545</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">976.78</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16490.49</TotalVehicleMass> - <Payload unit="kg">1277.49</Payload> - <PassengerCount>17.99</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">8.71857</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">639.09</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">18406.72</TotalVehicleMass> - <Payload unit="kg">3193.72</Payload> - <PassengerCount>44.98</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">9.20204</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">674.53</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">19588.08</TotalVehicleMass> - <Payload unit="kg">1738.08</Payload> - <PassengerCount>24.48</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">13.58782</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">996.02</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">23643.60</TotalVehicleMass> - <Payload unit="kg">5793.60</Payload> - <PassengerCount>81.60</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">15.57745</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1141.86</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">19703.95</TotalVehicleMass> - <Payload unit="kg">1853.95</Payload> - <PassengerCount>26.11</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">9.82883</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">720.47</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22484.88</TotalVehicleMass> - <Payload unit="kg">4634.88</Payload> - <PassengerCount>65.28</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">10.56696</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">774.58</CO2> - </Result> - </Results> - <ApplicationInformation> - <SimulationToolVersion>0.7.7.2547-DEV !!NOT FOR CERTIFICATION!!</SimulationToolVersion> - <Date>2022-02-04T13:12:27.6775278Z</Date> - </ApplicationInformation> - </Data> - <Signature> - <di:Reference URI="#VEH-bce95de06ff54c85bca9"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>3nwxGv2EIt273Cowtnqnd99NijSf4E6945LbLgs886M=</di:DigestValue> - </di:Reference> - </Signature> - </PrimaryVehicle> -</VectoOutputMultistep> \ No newline at end of file -- GitLab