From 45c38b9fe4948da5937666ab48a61d5d09476452 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 11 May 2017 14:04:28 +0200 Subject: [PATCH] major refactoring: use multiple full-load curves, one per gear. introduce vehicle-defined limits and gearbox-defined limits all test-cases green. --- VECTO/GUI/GearboxForm.vb | 5 +- VECTO/Input Files/Engine.vb | 10 ++- VECTO/Input Files/Gearbox.vb | 28 +++++--- VECTO/MainModule.vb | 11 ++-- .../XMLEngineeringVehicleDataProvider.cs | 4 +- .../DeclarationDataAdapter.cs | 58 ++++++++++++++--- .../EngineeringDataAdapter.cs | 22 +++++-- .../DeclarationModeVectoRunDataFactory.cs | 4 +- .../Impl/EngineOnlyVectoRunDataFactory.cs | 7 +- .../EngineeringModeVectoRunDataFactory.cs | 3 +- .../Models/Declaration/DeclarationData.cs | 40 ++++++------ .../Models/Simulation/Data/VectoRunData.cs | 17 +++-- .../Simulation/Impl/VehicleContainer.cs | 2 +- .../Data/CombustionEngineData.cs | 5 +- .../Data/Engine/EngineFullLoadCurve.cs | 12 +--- .../SimulationComponent/Data/FullLoadCurve.cs | 12 ++++ .../Impl/AMTShiftStrategy.cs | 5 +- .../Models/SimulationComponent/Impl/Clutch.cs | 2 +- .../Impl/CombustionEngine.cs | 27 ++++---- .../Impl/EngineOnlyCombustionEngine.cs | 2 +- .../SimulationComponent/Impl/Gearbox.cs | 3 + .../VectoCore/OutputData/DeclarationReport.cs | 3 +- .../OutputData/PDF/PDFDeclarationReport.cs | 6 +- .../OutputData/SummaryDataContainer.cs | 4 +- .../OutputData/XML/XMLDeclarationWriter.cs | 2 +- VectoCore/VectoCoreTest/FileIO/JsonTest.cs | 12 ++-- .../VectoCoreTest/Integration/ATPowerTrain.cs | 5 +- .../BusAuxiliaries/AuxDemandTest.cs | 3 +- .../Integration/CoachAdvancedAuxPowertrain.cs | 8 ++- .../Integration/CoachPowerTrain.cs | 4 +- .../EngineOnlyCycle/EngineOnlyCycleTest.cs | 4 +- .../SimulationRuns/FullPowertrain.cs | 12 ++-- .../SimulationRuns/MinimalPowertrain.cs | 6 +- .../Integration/Truck40tPowerTrain.cs | 7 +- .../Models/Declaration/ShiftPolygonTest.cs | 64 +++++++++++-------- .../Simulation/LossMapRangeValidationTest.cs | 10 +-- .../Simulation/MeasuredSpeedModeTest.cs | 16 ++++- .../Models/Simulation/PwheelModeTests.cs | 6 +- .../Simulation/VechicleContainerTests.cs | 2 +- .../SimulationComponent/ATGearboxTest.cs | 4 +- .../Models/SimulationComponent/ClutchTest.cs | 6 +- .../CombustionEngineTest.cs | 24 +++---- .../Models/SimulationComponent/DriverTest.cs | 9 +-- .../GearboxShiftLossesTest.cs | 2 +- .../Models/SimulationComponent/GearboxTest.cs | 40 +++++++----- .../FullLoadCurveTest.cs | 8 ++- .../SimulationComponentData/ValidationTest.cs | 57 +++++++++++++++-- .../VectoCoreTest/Reports/ModDataTest.cs | 2 +- VectoCore/VectoCoreTest/Utils/MockRunData.cs | 38 ++++++----- .../Utils/MockSimulationDataFactory.cs | 13 ++-- .../VectoCoreTest/Utils/ShiftPolygonDrawer.cs | 11 ++-- 51 files changed, 430 insertions(+), 237 deletions(-) diff --git a/VECTO/GUI/GearboxForm.vb b/VECTO/GUI/GearboxForm.vb index d07c54638e..83e598de7d 100644 --- a/VECTO/GUI/GearboxForm.vb +++ b/VECTO/GUI/GearboxForm.vb @@ -897,7 +897,7 @@ Public Class GearboxForm Private Function GetShiftLines(ByVal idleSpeed As PerSecond, engineFullLoadCurve As EngineFullLoadCurve, vehicle As IVehicleEngineeringInputData, gears As IList(Of ITransmissionInputData), ByVal gear As Integer) _ As ShiftPolygon - Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed) + Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed, gear, LvGears.Items(gear).SubItems(GearboxTbl.MaxTorque).Text.ToDouble(0).SI(Of NewtonMeter)) If gears.Count <= 1 Then Return Nothing End If @@ -911,8 +911,7 @@ Public Class GearboxForm If (rDyn.IsEqual(0)) Then Return Nothing End If - Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1, engine.FullLoadCurve, gears, - engine, + Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1, engine.FullLoadCurves(CType(gear, UInteger)), gears, engine, Double.Parse(LvGears.Items(0).SubItems(GearboxTbl.Ratio).Text, CultureInfo.InvariantCulture), (rDyn)) Return shiftLines diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb index 286919a19b..ea41d4562b 100644 --- a/VECTO/Input Files/Engine.vb +++ b/VECTO/Input Files/Engine.vb @@ -241,11 +241,15 @@ Public Class Engine Try If mode = ExecutionMode.Declaration Then Dim doa As DeclarationDataAdapter = New DeclarationDataAdapter() - - engineData = doa.CreateEngineData(engine, GearboxType.AMT) + Dim dummyGearboxData As IGearboxDeclarationInputData = New Gearbox() With { + .Type = GearboxType.AMT, + .MaxTorque = New List(Of String), + .GearRatios = New List(Of Double)() + } + engineData = doa.CreateEngineData(engine, dummyGearboxData, New List(Of ITorqueLimitInputData)) Else Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter() - engineData = doa.CreateEngineData(engine, Nothing) + engineData = doa.CreateEngineData(engine, Nothing, New List(Of ITorqueLimitInputData)) End If Dim result As IList(Of ValidationResult) = diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb index 378a26b4b1..c6fc9e6589 100644 --- a/VECTO/Input Files/Gearbox.vb +++ b/VECTO/Input Files/Gearbox.vb @@ -208,9 +208,10 @@ Public Class Gearbox Dim doa As DeclarationDataAdapter = New DeclarationDataAdapter() Try - engine = doa.CreateEngineData(inputData.EngineInputData, gearbox.Type) + + engine = doa.CreateEngineData(inputData.EngineInputData, gearbox, New List(Of ITorqueLimitInputData)) Catch - engine = GetDefaultEngine() + engine = GetDefaultEngine(gearbox.Gears) End Try axlegearData = doa.CreateAxleGearData(gearbox, False) @@ -218,9 +219,9 @@ Public Class Gearbox Else Dim doa As EngineeringDataAdapter = New EngineeringDataAdapter() Try - engine = doa.CreateEngineData(inputData.EngineInputData, gearbox) + engine = doa.CreateEngineData(inputData.EngineInputData, gearbox, New List(Of ITorqueLimitInputData)) Catch - engine = GetDefaultEngine() + engine = GetDefaultEngine(gearbox.Gears) End Try axlegearData = doa.CreateAxleGearData(gearbox, True) @@ -250,7 +251,7 @@ Public Class Gearbox End Try End Function - Private Shared Function GetDefaultEngine() As CombustionEngineData + Private Shared Function GetDefaultEngine(gears As IList(Of ITransmissionInputData)) As CombustionEngineData Dim fldData As MemoryStream = New MemoryStream() Dim writer As StreamWriter = New StreamWriter(fldData) writer.WriteLine("engine speed, full load torque, motoring torque") @@ -258,12 +259,21 @@ Public Class Gearbox writer.WriteLine("2500, 2000, -500") writer.Flush() fldData.Seek(0, SeekOrigin.Begin) + Dim retVal As CombustionEngineData = New CombustionEngineData() With { + .IdleSpeed = 600.RPMtoRad() + } Dim fldCurve As EngineFullLoadCurve = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldData)) - Return New CombustionEngineData() With { - .IdleSpeed = 600.RPMtoRad(), - .FullLoadCurve = fldCurve - } + Dim fullLoadCurves As Dictionary(Of UInteger, EngineFullLoadCurve) = + New Dictionary(Of UInteger, EngineFullLoadCurve)() + fullLoadCurves(0) = EngineFullLoadCurve.Create(VectoCSVFile.ReadStream(fldData)) + fullLoadCurves(0).EngineData = retVal + For i As Integer = 0 To gears.Count - 1 + fullLoadCurves(CType(i + 1, UInteger)) = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves(0), + gears(i).MaxTorque) + Next + retVal.FullLoadCurves = fullLoadCurves + Return retVal End Function diff --git a/VECTO/MainModule.vb b/VECTO/MainModule.vb index ed8d20ddd8..fa3baf3f87 100644 --- a/VECTO/MainModule.vb +++ b/VECTO/MainModule.vb @@ -16,6 +16,7 @@ Imports TUGraz.VectoCommon Imports TUGraz.VectoCommon.InputData Imports TUGraz.VectoCommon.OutputData Imports TUGraz.VectoCommon.Utils +Imports TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Imports TUGraz.VectoCore.Models.SimulationComponent.Data Imports TUGraz.VectoCore.Models.SimulationComponent.Data.Engine Imports VectoAuxiliaries @@ -27,10 +28,14 @@ Imports VectoAuxiliaries Module MainModule Public JobFileList As List(Of String) - Public Function ConvertToEngineData(fld As EngineFullLoadCurve, nIdle As PerSecond) As CombustionEngineData + Public Function ConvertToEngineData(ByVal fld As EngineFullLoadCurve, ByVal nIdle As PerSecond, ByVal gear As Integer, + ByVal maxTorque As NewtonMeter) As CombustionEngineData Dim retVal As CombustionEngineData = New CombustionEngineData() - retVal.FullLoadCurve = fld + Dim fullLoadCurves As Dictionary(Of UInteger, EngineFullLoadCurve) = New Dictionary(Of UInteger, EngineFullLoadCurve) + fullLoadCurves(0) = fld + fullLoadCurves(CType(gear, UInteger)) = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fld, maxTorque) + retVal.FullLoadCurves = fullLoadCurves retVal.IdleSpeed = nIdle Return retVal End Function @@ -63,6 +68,4 @@ Module MainModule End If Return filePath End Function - - End Module diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs index 6c4eebd7fb..53ff07727f 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringVehicleDataProvider.cs @@ -54,7 +54,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering { get { var retVal = new List<ITorqueLimitInputData>(); - var limits = Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, "Entry")); + var limits = + Navigator.Select(Helper.Query(VehiclePath, XMLNames.Vehicle_TorqueLimits, XMLNames.Vehicle_TorqueLimits_Entry), + Manager); while (limits.MoveNext()) { retVal.Add(new TorqueLimitInputData() { Gear = limits.Current.GetAttribute(XMLNames.Vehicle_TorqueLimits_Entry_Gear_Attr, "").ToInt(), diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 5ec459f13e..624be13dca 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -150,7 +150,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return DeclarationData.PoweredAxle(); } - internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, GearboxType gearboxType) + internal CombustionEngineData CreateEngineData(IEngineDeclarationInputData engine, + IGearboxDeclarationInputData gearbox, IEnumerable<ITorqueLimitInputData> torqueLimits) { if (!engine.SavedInDeclarationMode) { WarnDeclarationMode("EngineData"); @@ -161,12 +162,53 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter retVal.WHTCMotorway = engine.WHTCMotorway; retVal.WHTCRural = engine.WHTCRural; retVal.ColdHotCorrectionFactor = engine.ColdHotBalancingFactor; - retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearboxType); - retVal.FullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve, true); - retVal.FullLoadCurve.EngineData = retVal; + retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type); + var limits = torqueLimits.ToDictionary(e => e.Gear); + var numGears = gearbox.Gears.Count; + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); + fullLoadCurves[0] = EngineFullLoadCurve.Create(engine.FullLoadCurve, true); + fullLoadCurves[0].EngineData = retVal; + foreach (var gear in gearbox.Gears) { + var maxTorque = VectoMath.Min( + GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), + VehMaxTorque(gear, numGears, limits, fullLoadCurves[0].MaxTorque)); + fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); + } + retVal.FullLoadCurves = fullLoadCurves; return retVal; } + private static NewtonMeter VehMaxTorque(ITransmissionInputData gear, int numGears, + Dictionary<int, ITorqueLimitInputData> limits, + NewtonMeter maxEngineTorque) + { + if (gear.Gear - 1 >= numGears / 2) { + // only upper half of gears can limit if max-torque <= 0.95 of engine max torque + if (limits.ContainsKey(gear.Gear) && + limits[gear.Gear].MaxTorque <= DeclarationData.Engine.TorqueLimitVehicleFactor * maxEngineTorque) { + return limits[gear.Gear].MaxTorque; + } + } + return null; + } + + private static NewtonMeter GbxMaxTorque(ITransmissionInputData gear, int numGears, NewtonMeter maxEngineTorque + ) + { + if (gear.Gear - 1 < numGears / 2) { + // gears count from 1 to n, -> n entries, lower half can always limit + if (gear.MaxTorque != null) { + return gear.MaxTorque; + } + } else { + // upper half can only limit if max-torque <= 90% of engine max torque + if (gear.MaxTorque != null && gear.MaxTorque <= DeclarationData.Engine.TorqueLimitGearboxFactor * maxEngineTorque) { + return gear.MaxTorque; + } + } + return null; + } + internal GearboxData CreateGearboxData(IGearboxDeclarationInputData gearbox, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius, bool useEfficiencyFallback) { @@ -199,6 +241,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter TransmissionLossMap gearLossMap; retVal.Gears = gears.Select((gear, i) => { + uint gearNbr = (uint)(i + 1); try { if (gear.LossMap == null) { throw new InvalidFileFormatException(string.Format("LossMap for Gear {0} is missing.", i + 1)); @@ -212,11 +255,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } } - var fullLoadCurve = IntersectFullLoadCurves(engine.FullLoadCurve, gear.MaxTorque); - var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gears, engine, axlegearRatio, - dynamicTyreRadius); + var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, engine.FullLoadCurves[gearNbr], gears, engine, + axlegearRatio, dynamicTyreRadius); - return new KeyValuePair<uint, GearData>((uint)i + 1, + return new KeyValuePair<uint, GearData>(gearNbr, new GearData { LossMap = gearLossMap, ShiftPolygon = shiftPolygon, diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 9f6a5c08f2..e54a855fa2 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -124,7 +124,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Log.Error("{0} is in Declaration Mode but is used for Engineering Mode!", msg); } - internal CombustionEngineData CreateEngineData(IEngineEngineeringInputData engine, IGearboxEngineeringInputData gbx) + internal CombustionEngineData CreateEngineData(IEngineEngineeringInputData engine, IGearboxEngineeringInputData gbx, + IEnumerable<ITorqueLimitInputData> torqueLimits) { if (engine.SavedInDeclarationMode) { WarnEngineeringMode("EngineData"); @@ -133,8 +134,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var retVal = SetCommonCombustionEngineData(engine); retVal.Inertia = engine.Inertia + (gbx != null && gbx.Type.AutomaticTransmission() ? gbx.TorqueConverter.Inertia : 0.SI<KilogramSquareMeter>()); - retVal.FullLoadCurve = EngineFullLoadCurve.Create(engine.FullLoadCurve); - retVal.FullLoadCurve.EngineData = retVal; + var limits = torqueLimits.ToDictionary(e => e.Gear); + var numGears = gbx == null ? 0 : gbx.Gears.Count; + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); + fullLoadCurves[0] = EngineFullLoadCurve.Create(engine.FullLoadCurve); + fullLoadCurves[0].EngineData = retVal; + if (gbx != null) { + foreach (var gear in gbx.Gears) { + var maxTorque = VectoMath.Min(gear.MaxTorque, limits.ContainsKey(gear.Gear) ? limits[gear.Gear].MaxTorque : null); + fullLoadCurves[(uint)gear.Gear] = IntersectFullLoadCurves(fullLoadCurves[0], maxTorque); + } + } + retVal.FullLoadCurves = fullLoadCurves; retVal.WHTCCorrectionFactor = engine.WHTCEngineering; return retVal; } @@ -178,13 +189,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1); } - var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque); + //var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque); if (gearbox.Type.AutomaticTransmission() && gear.ShiftPolygon == null) { throw new VectoException("Shiftpolygons are required for AT Gearboxes!"); } var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing ? ShiftPolygonReader.Create(gear.ShiftPolygon) - : DeclarationData.Gearbox.ComputeShiftPolygon((int)i, fullLoadCurve, gearbox.Gears, engineData, axlegearRatio, + : DeclarationData.Gearbox.ComputeShiftPolygon((int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears, engineData, + axlegearRatio, dynamicTyreRadius); var gearData = new GearData { ShiftPolygon = shiftPolygon, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs index ca36a173d3..a20bddd1de 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs @@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var tempVehicle = dao.CreateVehicleData(InputDataProvider.VehicleInputData, InputDataProvider.AirdragInputData, segment.Missions.First(), segment.Missions.First().Loadings.First().Value, segment.VehicleHeight); - var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData.Type); + var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData, InputDataProvider.VehicleInputData.TorqueLimits); var axlegearData = dao.CreateAxleGearData(InputDataProvider.AxleGearInputData, false); var angledriveData = dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, false); var gearboxData = dao.CreateGearboxData(InputDataProvider.GearboxInputData, engineData, axlegearData.AxleGear.Ratio, @@ -95,7 +95,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl }; Report.InitializeReport(powertrainConfig, segment); } - var maxEnginePower = engineData.FullLoadCurve.FullLoadStationaryPower(engineData.FullLoadCurve.PreferredSpeed); + var maxEnginePower = engineData.FullLoadCurves[0].FullLoadStationaryPower(engineData.FullLoadCurves[0].PreferredSpeed); foreach (var mission in segment.Missions) { if (mission.MissionType.IsEMS() && maxEnginePower.IsSmaller(DeclarationData.MinEnginePowerForEMS)) { continue; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs index 7ffdd8c59a..d5c91e579d 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs @@ -52,10 +52,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl foreach (var cycle in InputDataProvider.JobInputData().Cycles) { var simulationRunData = new VectoRunData { JobName = InputDataProvider.JobInputData().JobName, - EngineData = dao.CreateEngineData(InputDataProvider.EngineInputData, null), - Cycle = - new DrivingCycleProxy( - DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), cycle.Name), + EngineData = dao.CreateEngineData(InputDataProvider.EngineInputData, null, new List<ITorqueLimitInputData>()), + Cycle = new DrivingCycleProxy( + DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), cycle.Name), ExecutionMode = ExecutionMode.Engineering }; yield return simulationRunData; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index 75c8f302d9..737b325469 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -61,7 +61,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { var dao = new EngineeringDataAdapter(); var driver = dao.CreateDriverData(InputDataProvider.DriverInputData); - var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData); + var engineData = dao.CreateEngineData(InputDataProvider.EngineInputData, InputDataProvider.GearboxInputData, + InputDataProvider.VehicleInputData.TorqueLimits); var tempVehicle = dao.CreateVehicleData(InputDataProvider.VehicleInputData, InputDataProvider.AirdragInputData); diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index d48e4cce70..a937b6c80b 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -39,6 +39,7 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; using TUGraz.VectoCore.Utils; @@ -163,6 +164,9 @@ namespace TUGraz.VectoCore.Models.Declaration public static readonly KilogramSquareMeter EngineBaseInertia = 0.41.SI<KilogramSquareMeter>(); public static readonly SI EngineDisplacementInertia = (0.27 * 1000).SI().Kilo.Gramm.Per.Meter; // [kg/m] + + public const double TorqueLimitGearboxFactor = 0.9; + public const double TorqueLimitVehicleFactor = 0.95; public static KilogramSquareMeter EngineInertia(CubicMeter displacement, GearboxType gbxType) { @@ -196,14 +200,14 @@ namespace TUGraz.VectoCore.Models.Declaration /// <summary> /// computes the shift polygons for a single gear according to the whitebook 2016 /// </summary> - /// <param name="gear">index of the gear to compute the shift polygons for</param> + /// <param name="gearIdx">index of the gear to compute the shift polygons for -- gear number - 1!</param> /// <param name="fullLoadCurve">engine full load curve, potentially limited by the gearbox</param> /// <param name="gears">list of gears</param> /// <param name="engine">engine data</param> /// <param name="axlegearRatio"></param> /// <param name="dynamicTyreRadius"></param> /// <returns></returns> - public static ShiftPolygon ComputeShiftPolygon(int gear, FullLoadCurve fullLoadCurve, + public static ShiftPolygon ComputeShiftPolygon(int gearIdx, EngineFullLoadCurve fullLoadCurve, IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius) { if (gears.Count < 2) { @@ -213,20 +217,20 @@ namespace TUGraz.VectoCore.Models.Declaration // ReSharper disable once InconsistentNaming var engineSpeed85kmhLastGear = ComputeEngineSpeed85kmh(gears[gears.Count - 1], axlegearRatio, dynamicTyreRadius); - var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurve.RatedSpeed); + var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurves[0].RatedSpeed); var diffRatio = gears[gears.Count - 2].Ratio / gears[gears.Count - 1].Ratio - 1; - var maxDragTorque = engine.FullLoadCurve.MaxDragTorque * 1.1; + var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1; var p1 = new Point(engine.IdleSpeed.Value() / 2, 0); var p2 = new Point(engine.IdleSpeed.Value() * 1.1, 0); var p3 = new Point(nVHigh.Value() * 0.9, - engine.FullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value()); + fullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value()); var p4 = new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0); - var p5 = new Point(engine.FullLoadCurve.N95hSpeed.Value(), engine.FullLoadCurve.MaxTorque.Value()); + var p5 = new Point(fullLoadCurve.N95hSpeed.Value(), fullLoadCurve.MaxTorque.Value()); var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X)); var p7 = new Point(p4.X, VectoMath.Interpolate(p2, p5, p4.X)); @@ -235,23 +239,23 @@ namespace TUGraz.VectoCore.Models.Declaration var downshiftCorr = MoveDownshiftBelowFld(Edge.Create(p6, p3), fldMargin, 1.1 * fullLoadCurve.MaxTorque); var downShift = new List<ShiftPolygon.ShiftPolygonEntry>(); - if (gear > 0) { + if (gearIdx > 0) { downShift = new[] { p2, downshiftCorr.P1, downshiftCorr.P2 }.Select( - point => new ShiftPolygon.ShiftPolygonEntry() { - AngularSpeed = point.X.SI<PerSecond>(), - Torque = point.Y.SI<NewtonMeter>() - }) + point => new ShiftPolygon.ShiftPolygonEntry() { + AngularSpeed = point.X.SI<PerSecond>(), + Torque = point.Y.SI<NewtonMeter>() + }) .ToList(); downShift[0].Torque = maxDragTorque; } var upShift = new List<ShiftPolygon.ShiftPolygonEntry>(); - if (gear >= gears.Count - 1) { + if (gearIdx >= gears.Count - 1) { return new ShiftPolygon(downShift, upShift); } - var gearRatio = gears[gear].Ratio / gears[gear + 1].Ratio; + var gearRatio = gears[gearIdx].Ratio / gears[gearIdx + 1].Ratio; var rpmMarginFactor = 1 + ShiftPolygonRPMMargin / 100.0; // ReSharper disable InconsistentNaming @@ -387,11 +391,11 @@ namespace TUGraz.VectoCore.Models.Declaration var data = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId); var characteristicTorque = (from DataRow row in data.Rows select - new TorqueConverterEntry() { - SpeedRatio = row.ParseDouble(TorqueConverterDataReader.Fields.SpeedRatio), - Torque = row.ParseDouble(TorqueConverterDataReader.Fields.CharacteristicTorque).SI<NewtonMeter>(), - TorqueRatio = row.ParseDouble(TorqueConverterDataReader.Fields.TorqueRatio) - }).ToArray(); + new TorqueConverterEntry() { + SpeedRatio = row.ParseDouble(TorqueConverterDataReader.Fields.SpeedRatio), + Torque = row.ParseDouble(TorqueConverterDataReader.Fields.CharacteristicTorque).SI<NewtonMeter>(), + TorqueRatio = row.ParseDouble(TorqueConverterDataReader.Fields.TorqueRatio) + }).ToArray(); foreach (var torqueConverterEntry in characteristicTorque) { torqueConverterEntry.SpeedRatio = torqueConverterEntry.SpeedRatio * ratio; torqueConverterEntry.TorqueRatio = torqueConverterEntry.TorqueRatio / ratio; diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index b56c36fd50..bdb4ad19c1 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -133,10 +133,17 @@ namespace TUGraz.VectoCore.Models.Simulation.Data var axlegearRatio = axleGearData != null ? axleGearData.AxleGear.Ratio : 1.0; var dynamicTyreRadius = runData.VehicleData != null ? runData.VehicleData.DynamicTyreRadius : 0.0.SI<Meter>(); + if (gearboxData.Gears.Count + 1 != engineData.FullLoadCurves.Count) { + return + new ValidationResult( + string.Format("number of full-load curves in engine does not match gear count. engine fld: {0}, gears: {1}", + engineData.FullLoadCurves.Count, gearboxData.Gears.Count)); + } + foreach (var gear in gearboxData.Gears) { for (var angularVelocity = engineData.IdleSpeed; - angularVelocity < engineData.FullLoadCurve.RatedSpeed; - angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurve.RatedSpeed - engineData.IdleSpeed) / 10.0) { + angularVelocity < engineData.FullLoadCurves[gear.Key].RatedSpeed; + angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurves[gear.Key].RatedSpeed - engineData.IdleSpeed) / 10.0) { if (!gear.Value.HasLockedGear) { continue; } @@ -147,9 +154,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data continue; } - for (var inTorque = engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 3; - inTorque < engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity); - inTorque += 2.0 / 3.0 * engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 10.0) { + for (var inTorque = engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 3; + inTorque < engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity); + inTorque += 2.0 / 3.0 * engineData.FullLoadCurves[gear.Key].FullLoadStationaryTorque(angularVelocity) / 10.0) { NewtonMeter angledriveTorque; try { angledriveTorque = gear.Value.LossMap.GetOutTorque(angularVelocity, inTorque); diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 17a34bbcf6..9be939e92d 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -86,7 +86,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl "CA1065:DoNotRaiseExceptionsInUnexpectedLocations")] get { if (Gearbox == null) { - throw new VectoException("no gearbox available!"); + return 0; // throw new VectoException("no gearbox available!"); } return Gearbox.Gear; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs index 238da75a9e..e5d591f6a0 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs @@ -30,6 +30,7 @@ */ using System; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -63,7 +64,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public FuelConsumptionMap ConsumptionMap { get; internal set; } [Required, ValidateObject] - public EngineFullLoadCurve FullLoadCurve { get; internal set; } + public Dictionary<uint, EngineFullLoadCurve> FullLoadCurves { get; internal set; } [Required, Range(double.MinValue, double.MaxValue)] public double ColdHotCorrectionFactor { get; internal set; } @@ -87,7 +88,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data WHTCRural = WHTCRural, WHTCMotorway = WHTCMotorway, ConsumptionMap = ConsumptionMap, - FullLoadCurve = FullLoadCurve, + FullLoadCurves = FullLoadCurves, WHTCCorrectionFactor = WHTCCorrectionFactor, }; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs index 74c86b524a..fa6b684bf5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs @@ -57,7 +57,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine return new EngineFullLoadCurve { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data }; } - public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false) + public static EngineFullLoadCurve Create(DataTable data, bool declarationMode = false, NewtonMeter maxTorque = null) { var curve = FullLoadCurveReader.Create(data, declarationMode, true); return new EngineFullLoadCurve() { FullLoadEntries = curve.FullLoadEntries, PT1Data = curve.PT1Data }; @@ -143,16 +143,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine } } - public NewtonMeter MaxLoadTorque - { - get { return FullLoadEntries.Max(x => x.TorqueFullLoad); } - } - - public NewtonMeter MaxDragTorque - { - get { return FullLoadEntries.Min(x => x.TorqueDrag); } - } - private void ComputePreferredSpeed() { var maxArea = ComputeArea(EngineData.IdleSpeed, N95hSpeed); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs index 670633b29d..b7bf245479 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/FullLoadCurve.cs @@ -46,6 +46,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data private Watt _maxPower; private PerSecond _ratedSpeed; private NewtonMeter _maxTorque; + private NewtonMeter _maxDragTorque; [Required, ValidateObject] internal List<FullLoadCurveEntry> FullLoadEntries; @@ -76,6 +77,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data get { return _maxTorque ?? FindMaxTorque(); } } + public NewtonMeter MaxDragTorque + { + get { return _maxDragTorque ?? FindMaxDragTorque(); } + } + public virtual NewtonMeter FullLoadStationaryTorque(PerSecond angularVelocity) { var idx = FindIndex(angularVelocity); @@ -98,6 +104,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data return _maxTorque; } + private NewtonMeter FindMaxDragTorque() + { + _maxDragTorque = FullLoadEntries.Min(x => x.TorqueDrag); + return _maxDragTorque; + } + /// <summary> /// Compute the engine's rated speed from the given full-load curve (i.e. engine speed with max. power) /// </summary> diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs index 55e58e1d61..83fc6641c1 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs @@ -55,7 +55,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var transmissionRatio = runData.AxleGearData.AxleGear.Ratio * (runData.AngledriveData == null ? 1.0 : runData.AngledriveData.Angledrive.Ratio) / runData.VehicleData.DynamicTyreRadius; - var minEngineSpeed = (runData.EngineData.FullLoadCurve.RatedSpeed - runData.EngineData.IdleSpeed) * + var minEngineSpeed = (runData.EngineData.FullLoadCurves[0].RatedSpeed - runData.EngineData.IdleSpeed) * Constants.SimulationSettings.ClutchClosingSpeedNorm + runData.EngineData.IdleSpeed; foreach (var gearData in ModelData.Gears.Reverse()) { if (ModelData.StartSpeed * transmissionRatio * gearData.Value.Ratio > minEngineSpeed) { @@ -73,7 +73,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private bool SpeedTooHighForEngine(uint gear, PerSecond outAngularSpeed) { return - (outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineN95hSpeed); + (outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? + DataBus.EngineN95hSpeed); } public override GearInfo NextGear diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs index a91230bd38..92f2cc3add 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Clutch.cs @@ -63,7 +63,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Clutch(IVehicleContainer container, CombustionEngineData engineData) : base(container) { _idleSpeed = engineData.IdleSpeed; - _ratedSpeed = engineData.FullLoadCurve.RatedSpeed; + _ratedSpeed = engineData.FullLoadCurves[0].RatedSpeed; _clutchSpeedSlippingFactor = Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed) / (_idleSpeed + Constants.SimulationSettings.ClutchClosingSpeedNorm * (_ratedSpeed - _idleSpeed)); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index 7d58da8dc8..05f307760e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -86,7 +86,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl PreviousState.EngineSpeed = ModelData.IdleSpeed; PreviousState.dt = 1.SI<Second>(); - StationaryIdleFullLoadPower = ModelData.FullLoadCurve.FullLoadStationaryTorque(ModelData.IdleSpeed) * + StationaryIdleFullLoadPower = ModelData.FullLoadCurves[0].FullLoadStationaryTorque(ModelData.IdleSpeed) * ModelData.IdleSpeed; } @@ -104,12 +104,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Watt EngineStationaryFullPower(PerSecond angularSpeed) { - return ModelData.FullLoadCurve.FullLoadStationaryTorque(angularSpeed) * angularSpeed; + return ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularSpeed) * angularSpeed; } public Watt EngineDragPower(PerSecond angularSpeed) { - return ModelData.FullLoadCurve.DragLoadStationaryPower(angularSpeed); + return ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryPower(angularSpeed); } public PerSecond EngineIdleSpeed @@ -119,18 +119,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public PerSecond EngineRatedSpeed { - get { return ModelData.FullLoadCurve.RatedSpeed; } + get { return ModelData.FullLoadCurves[0].RatedSpeed; } } public PerSecond EngineN95hSpeed { - get { return ModelData.FullLoadCurve.N95hSpeed; } + get { return ModelData.FullLoadCurves[0].N95hSpeed; } } public PerSecond EngineN80hSpeed { - get { return ModelData.FullLoadCurve.N80hSpeed; } + get { return ModelData.FullLoadCurves[0].N80hSpeed; } } public IIdleController IdleController @@ -181,7 +181,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var avgEngineSpeed = (PreviousState.EngineSpeed + angularVelocity) / 2.0; - var fullDragTorque = ModelData.FullLoadCurve.DragLoadStationaryTorque(avgEngineSpeed); + var fullDragTorque = ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryTorque(avgEngineSpeed); var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun); if (dynamicFullLoadPower < 0) { dynamicFullLoadPower = 0.SI<Watt>(); @@ -303,8 +303,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl EngineSpeed = outAngularVelocity, dt = 1.SI<Second>(), InertiaTorqueLoss = 0.SI<NewtonMeter>(), - StationaryFullLoadTorque = ModelData.FullLoadCurve.FullLoadStationaryTorque(outAngularVelocity), - FullDragTorque = ModelData.FullLoadCurve.DragLoadStationaryTorque(outAngularVelocity), + StationaryFullLoadTorque = ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(outAngularVelocity), + FullDragTorque = ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryTorque(outAngularVelocity), EngineTorque = outTorque + auxDemand, EnginePower = (outTorque + auxDemand) * outAngularVelocity, }; @@ -368,7 +368,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Log.Warn("FuelConsumptionMap was extrapolated: range for FC-Map is not sufficient: n: {0}, torque: {1}", avgEngineSpeed.Value(), CurrentState.EngineTorque.Value()); } - var pt1 = ModelData.FullLoadCurve.PT1(avgEngineSpeed); + var pt1 = ModelData.FullLoadCurves[DataBus.Gear].PT1(avgEngineSpeed); if (DataBus.ExecutionMode == ExecutionMode.Declaration && pt1.Extrapolated) { Log.Error("requested rpm below minimum rpm in pt1 - extrapolating. n_eng_avg: {0}", avgEngineSpeed); @@ -433,7 +433,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl throw new VectoException("ComputeFullLoadPower cannot compute for simulation interval length 0."); } - CurrentState.StationaryFullLoadTorque = ModelData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity); + CurrentState.StationaryFullLoadTorque = + ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularVelocity); var stationaryFullLoadPower = CurrentState.StationaryFullLoadTorque * angularVelocity; Watt dynFullPowerCalculated = 0.SI<Watt>(); @@ -442,7 +443,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl dynFullPowerCalculated = stationaryFullLoadPower; } else { try { - var pt1 = ModelData.FullLoadCurve.PT1(angularVelocity).Value.Value(); + var pt1 = ModelData.FullLoadCurves[DataBus.Gear].PT1(angularVelocity).Value.Value(); var powerRatio = (PreviousState.EnginePower / stationaryFullLoadPower).Value(); var tStarPrev = pt1 * Math.Log(1.0 / (1 - powerRatio), Math.E).SI<Second>(); var tStar = tStarPrev + PreviousState.dt; @@ -625,7 +626,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var idleTime = absTime - _idleStart + dt; var prevEngineSpeed = _engine.PreviousState.EngineSpeed; - var dragLoad = _engine.ModelData.FullLoadCurve.DragLoadStationaryPower(prevEngineSpeed); + var dragLoad = _engine.ModelData.FullLoadCurves[0].DragLoadStationaryPower(prevEngineSpeed); var nextEnginePower = (_lastEnginePower - dragLoad) * Math.Max(0, idleTime.Value() * PeDropSlope + PeDropOffset) + dragLoad; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs index d699ad941d..dd481bd07e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs @@ -67,7 +67,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var totalTorqueDemand = CurrentState.EngineTorqueOut + auxTorqueDemand + CurrentState.InertiaTorqueLoss; CurrentState.EngineTorque = totalTorqueDemand; - CurrentState.FullDragTorque = ModelData.FullLoadCurve.DragLoadStationaryTorque(avgEngineSpeed); + CurrentState.FullDragTorque = ModelData.FullLoadCurves[0].DragLoadStationaryTorque(avgEngineSpeed); var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun); CurrentState.DynamicFullLoadTorque = dynamicFullLoadPower / avgEngineSpeed; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index e93fb37e67..9107816957 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -112,6 +112,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity) { + var oldGear = Gear; + Gear = gear; var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio; var torqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); CurrentState.TorqueLossResult = torqueLossResult; @@ -139,6 +141,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity); + Gear = oldGear; return new ResponseDryRun { Source = this, EnginePowerRequest = response.EnginePowerRequest, diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index afe1d98050..d49000c659 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -38,6 +38,7 @@ using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.OutputData.PDF; namespace TUGraz.VectoCore.OutputData @@ -105,7 +106,7 @@ namespace TUGraz.VectoCore.OutputData /// <summary> /// The full load curve. /// </summary> - internal FullLoadCurve Flc { get; set; } + internal Dictionary<uint, EngineFullLoadCurve> Flc { get; set; } /// <summary> /// The declaration segment from the segment table diff --git a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs index 2c372d3fa6..6de5e8b194 100644 --- a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs @@ -171,8 +171,8 @@ namespace TUGraz.VectoCore.OutputData.PDF EngineModel = modelData.EngineData.ModelName; EngineStr = string.Format("{0} l, {1} kW", modelData.EngineData.Displacement.ConvertTo().Cubic.Dezi.Meter.ToOutputFormat(1), - modelData.EngineData.FullLoadCurve.MaxPower.ConvertTo().Kilo.Watt.ToOutputFormat(0)); - Flc = modelData.EngineData.FullLoadCurve; + modelData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt.ToOutputFormat(0)); + Flc = modelData.EngineData.FullLoadCurves; GearboxModel = modelData.GearboxData.ModelName; GearboxStr = string.Format("{0}-Speed {1}", modelData.GearboxData.Gears.Count, modelData.GearboxData.Type); } @@ -322,7 +322,7 @@ namespace TUGraz.VectoCore.OutputData.PDF img.SetAbsolutePosition(17, 270); content.AddImage(img); - img = Image.GetInstance(DrawOperatingPointsChart(results.ModData[LoadingType.ReferenceLoad], Flc), BaseColor.WHITE); + img = Image.GetInstance(DrawOperatingPointsChart(results.ModData[LoadingType.ReferenceLoad], Flc[0]), BaseColor.WHITE); img.ScaleAbsolute(420, 178); img.SetAbsolutePosition(375, 75); content.AddImage(img); diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 8830dd9c95..f481ff32ce 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -228,10 +228,10 @@ namespace TUGraz.VectoCore.OutputData row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight; row[ENGINE_RATED_POWER] = - runData.EngineData.FullLoadCurve.FullLoadStationaryPower(runData.EngineData.FullLoadCurve.RatedSpeed) + runData.EngineData.FullLoadCurves[0].FullLoadStationaryPower(runData.EngineData.FullLoadCurves[0].RatedSpeed) .ConvertTo().Kilo.Watt; row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>(); - row[ENGINE_RATED_SPEED] = runData.EngineData.FullLoadCurve.RatedSpeed.AsRPM.SI<Scalar>(); + row[ENGINE_RATED_SPEED] = runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>(); row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter; row[CD_x_A] = runData.VehicleData.CrossWindCorrectionCurve.AirDragArea; row[ROLLING_RESISTANCE_COEFFICIENT] = runData.VehicleData.TotalRollResistanceCoefficient.SI<Scalar>(); diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs index 4c0d83cbf8..9e290eaadc 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationWriter.cs @@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement(tns + XMLNames.Engine_IdlingSpeed, data.IdleSpeed.AsRPM.ToXMLFormat(0)), new XElement(tns + XMLNames.Engine_RatedSpeed, fld.RatedSpeed.AsRPM.ToXMLFormat(0)), new XElement(tns + XMLNames.Engine_RatedPower, fld.FullLoadStationaryPower(fld.RatedSpeed).ToXMLFormat(0)), - new XElement(tns + XMLNames.Engine_MaxTorque, fld.MaxLoadTorque.ToXMLFormat(0)), + new XElement(tns + XMLNames.Engine_MaxTorque, fld.MaxTorque.ToXMLFormat(0)), new XElement(tns + XMLNames.Engine_WHTCUrban, data.WHTCUrban.ToXMLFormat(4)), new XElement(tns + XMLNames.Engine_WHTCRural, data.WHTCRural.ToXMLFormat(4)), new XElement(tns + XMLNames.Engine_WHTCMotorway, data.WHTCMotorway.ToXMLFormat(4)), diff --git a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs index 2116574289..83813343c9 100644 --- a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs +++ b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs @@ -164,7 +164,8 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio); } var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider, - MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(), + MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1, + 0.5.SI<Meter>(), true); Assert.AreEqual(ratios.Length, gbxData.Gears.Count); @@ -188,7 +189,8 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio); } var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider, - MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(), + MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1, + 0.5.SI<Meter>(), true); Assert.AreEqual(ratios.Length, gbxData.Gears.Count); @@ -214,7 +216,8 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio); } var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider, - MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(), + MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1, + 0.5.SI<Meter>(), true); Assert.AreEqual(ratios.Length, gbxData.Gears.Count); @@ -239,7 +242,8 @@ namespace TUGraz.VectoCore.Tests.FileIO Assert.AreEqual(ratios[i], inputProvider.Gears[i].Ratio); } var gbxData = new EngineeringDataAdapter().CreateGearboxData(inputProvider, - MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng"), 2.1, 0.5.SI<Meter>(), + MockSimulationDataFactory.CreateEngineDataFromFile(@"TestData\Components\AT_GBX\Engine.veng", 0), 2.1, + 0.5.SI<Meter>(), true); Assert.AreEqual(ratios.Length, gbxData.Gears.Count); diff --git a/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs index 22c107008b..a16361c577 100644 --- a/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs +++ b/VectoCore/VectoCoreTest/Integration/ATPowerTrain.cs @@ -82,9 +82,10 @@ namespace TUGraz.VectoCore.Tests.Integration HasTorqueConverter = true }; - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var gearboxData = CreateGearboxData(gbxType); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var axleGearData = CreateAxleGearData(gbxType); - var gearboxData = CreateGearboxData(gbxType); + if (gearBoxInertia != null) { gearboxData.Inertia = gearBoxInertia; } diff --git a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs index 3cf1cb4cf8..91912d7232 100644 --- a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs @@ -29,6 +29,7 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System.Collections.Generic; using NUnit.Framework; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -127,7 +128,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var fld = EngineFullLoadCurve.ReadFromFile(engineFLDFilePath); var modelData = new CombustionEngineData() { ConsumptionMap = fcMap, - FullLoadCurve = fld, + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, fld }, { 1, fld } }, IdleSpeed = 560.SI<PerSecond>() }; diff --git a/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs b/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs index 2ed4af76d5..79ce266962 100644 --- a/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs +++ b/VectoCore/VectoCoreTest/Integration/CoachAdvancedAuxPowertrain.cs @@ -80,9 +80,10 @@ namespace TUGraz.VectoCore.Tests.Integration RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData } }; - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(highEnginePower ? EngineFileHigh : EngineFile); - var axleGearData = CreateAxleGearData(); var gearboxData = CreateGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(highEnginePower ? EngineFileHigh : EngineFile, + gearboxData.Gears.Count); + var axleGearData = CreateAxleGearData(); var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); var driverData = CreateDriverData(AccelerationFile, overspeed); @@ -184,7 +185,8 @@ namespace TUGraz.VectoCore.Tests.Integration //AerodynamicDragAera = 3.2634.SI<SquareMeter>(), //CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection, CrossWindCorrectionCurve = - new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(), CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()), + new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(), + CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()), CrossWindCorrectionMode.NoCorrection), CurbWeight = 15700.SI<Kilogram>(), Loading = loading, diff --git a/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs index aa100b2d60..fef70e6d68 100644 --- a/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs +++ b/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs @@ -80,9 +80,9 @@ namespace TUGraz.VectoCore.Tests.Integration RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData } }; - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineHighPower ? EngineFileHigh : EngineFile); - var axleGearData = CreateAxleGearData(); var gearboxData = CreateGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineHighPower ? EngineFileHigh : EngineFile, gearboxData.Gears.Count); + var axleGearData = CreateAxleGearData(); if (gearBoxInertia != null) { gearboxData.Inertia = gearBoxInertia; } diff --git a/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs index 16b80d77c4..526abde344 100644 --- a/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs +++ b/VectoCore/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs @@ -71,7 +71,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle var vehicle = new VehicleContainer(ExecutionMode.Engineering); // ReSharper disable once ObjectCreationAsStatement new MockDrivingCycle(vehicle, data); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 0); var aux = new EngineAuxiliary(vehicle); aux.AddCycle(Constants.Auxiliaries.Cycle); @@ -114,7 +114,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering); - var engine = new CombustionEngine(vehicleContainer, MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile)); + var engine = new CombustionEngine(vehicleContainer, MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 0)); var absTime = 0.SI<Second>(); var dt = 1.SI<Second>(); diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs index 3e8fa4dce3..6f2f22579b 100644 --- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs +++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs @@ -74,10 +74,10 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns var modData = new ModalDataContainer("Coach_FullPowertrain_SimpleGearbox", fileWriter); var container = new VehicleContainer(ExecutionMode.Engineering, modData); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var gearboxData = CreateSimpleGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false); var axleGearData = CreateAxleGearData(); - var gearboxData = CreateSimpleGearboxData(); var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); var driverData = CreateDriverData(AccelerationFile); @@ -137,10 +137,10 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns var modData = new ModalDataContainer("Coach_FullPowertrain", fileWriter); var container = new VehicleContainer(ExecutionMode.Engineering, modData); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var gearboxData = CreateGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var cycleData = DrivingCycleDataReader.ReadFromFile(CoachCycleFile, CycleType.DistanceBased, false); var axleGearData = CreateAxleGearData(); - var gearboxData = CreateGearboxData(); var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); var driverData = CreateDriverData(AccelerationFile); @@ -215,10 +215,10 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns var modData = new ModalDataContainer("Coach_FullPowertrain_LowSpeed", fileWriter); var container = new VehicleContainer(ExecutionMode.Engineering, modData); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var gearboxData = CreateGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false); var axleGearData = CreateAxleGearData(); - var gearboxData = CreateGearboxData(); var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); var driverData = CreateDriverData(AccelerationFile); diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs index dfd2505c64..e01dbeb844 100644 --- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs +++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs @@ -66,7 +66,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns [TestMethod] public void TestWheelsAndEngineInitialize() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1); var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); @@ -111,7 +111,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns public void TestWheelsAndEngine() { NLog.LogManager.DisableLogging(); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1); var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFile, CycleType.DistanceBased, false); var axleGearData = CreateAxleGearData(); @@ -183,7 +183,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns [TestMethod] public void TestWheelsAndEngineLookahead() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1); var cycleData = DrivingCycleDataReader.ReadFromFile(CycleFileStop, CycleType.DistanceBased, false); var axleGearData = CreateAxleGearData(); diff --git a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs index eda5f61483..428b90cdd6 100644 --- a/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs +++ b/VectoCore/VectoCoreTest/Integration/Truck40tPowerTrain.cs @@ -90,9 +90,9 @@ namespace TUGraz.VectoCore.Tests.Integration RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData } }; - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); - var axleGearData = CreateAxleGearData(); var gearboxData = CreateGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); + var axleGearData = CreateAxleGearData(); var vehicleData = CreateVehicleData(massExtra, loading); var driverData = CreateDriverData(AccelerationFile, overspeed); @@ -221,7 +221,8 @@ namespace TUGraz.VectoCore.Tests.Integration //AerodynamicDragAera = 6.2985.SI<SquareMeter>(), //CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection, CrossWindCorrectionCurve = - new CrosswindCorrectionCdxALookup(6.2985.SI<SquareMeter>(), CrossWindCorrectionCurveReader.GetNoCorrectionCurve(6.2985.SI<SquareMeter>()), + new CrosswindCorrectionCdxALookup(6.2985.SI<SquareMeter>(), + CrossWindCorrectionCurveReader.GetNoCorrectionCurve(6.2985.SI<SquareMeter>()), CrossWindCorrectionMode.NoCorrection), CurbWeight = 7100.SI<Kilogram>() + massExtra, Loading = loading, diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs index 8327aeb312..9c0c25cabf 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs @@ -342,14 +342,14 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration }; var dao = new DeclarationDataAdapter(); - var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile), - GearboxType.AMT); - var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile); + var engineData = dao.CreateEngineData(new JSONEngineDataV3(JSONInputDataFactory.ReadFile(engineFile), engineFile), + gearboxData, new List<ITorqueLimitInputData>()); var shiftPolygons = new List<ShiftPolygon>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { - shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurve, gearboxData.Gears, + shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurves[(uint)(i + 1)], + gearboxData.Gears, engineData, axlegearRatio, rdyn)); } @@ -383,32 +383,37 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var rdyn = 0.4882675.SI<Meter>(); var axlegearRatio = 3.71; //2.31; // 3.71; //2.59; + var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile); + + var engineData = new CombustionEngineData() { IdleSpeed = 509.RPMtoRad(), - FullLoadCurve = EngineFullLoadCurve.ReadFromFile(engineFldFile, true) }; - engineData.FullLoadCurve.EngineData = engineData; - var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile); + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(); + fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(engineFldFile, true); + fullLoadCurves[0].EngineData = engineData; + for (uint i = 1; i <= gearboxData.Gears.Count; i++) { + fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0], + gearboxData.Gears[(int)(i - 1)].MaxTorque); + } + engineData.FullLoadCurves = fullLoadCurves; + var shiftPolygons = new List<ShiftPolygon>(); var downshiftTransformed = new List<List<Point>>(); var downshiftOrig = new List<List<Point>>(); var upshiftOrig = new List<List<Point>>(); - var fullLoadCurves = new List<EngineFullLoadCurve>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { - var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineData.FullLoadCurve, - gearboxData.Gears[i].MaxTorque); - shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gearboxData.Gears, + shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn)); List<Point> tmp1, tmp2, tmp3; - ShiftPolygonComparison.ComputShiftPolygonPoints(i, fullLoadCurve, gearboxData.Gears, + ShiftPolygonComparison.ComputShiftPolygonPoints(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn, out tmp1, out tmp2, out tmp3); upshiftOrig.Add(tmp1); downshiftTransformed.Add(tmp2); downshiftOrig.Add(tmp3); - fullLoadCurves.Add(fullLoadCurve); } ShiftPolygonDrawer.DrawShiftPolygons(Path.GetDirectoryName(gearboxFile), fullLoadCurves, shiftPolygons, @@ -465,32 +470,35 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.Ignore("Confidential File not found. Test cannot run without file."); } + var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(Path.Combine(BasePath, gearboxFile)), + Path.Combine(BasePath, gearboxFile)); var engineData = new CombustionEngineData() { IdleSpeed = idlingSpeed.RPMtoRad(), - FullLoadCurve = EngineFullLoadCurve.ReadFromFile(Path.Combine(BasePath, engineFldFile), true) }; - engineData.FullLoadCurve.EngineData = engineData; - var gearboxData = new JSONGearboxDataV6(JSONInputDataFactory.ReadFile(Path.Combine(BasePath, gearboxFile)), - Path.Combine(BasePath, gearboxFile)); + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(); + fullLoadCurves[0] = EngineFullLoadCurve.ReadFromFile(Path.Combine(BasePath, engineFldFile), true); + fullLoadCurves[0].EngineData = engineData; + for (uint i = 1; i <= gearboxData.Gears.Count; i++) { + fullLoadCurves[i] = AbstractSimulationDataAdapter.IntersectFullLoadCurves(fullLoadCurves[0], + gearboxData.Gears[(int)(i - 1)].MaxTorque); + } + engineData.FullLoadCurves = fullLoadCurves; + var shiftPolygons = new List<ShiftPolygon>(); var downshiftTransformed = new List<List<Point>>(); var upshiftOrig = new List<List<Point>>(); - var fullLoadCurves = new List<EngineFullLoadCurve>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { - var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineData.FullLoadCurve, - gearboxData.Gears[i].MaxTorque); shiftPolygons.Add( - DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gearboxData.Gears, + DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn.SI<Meter>()) ); List<Point> tmp1, tmp2, tmp3; - ComputShiftPolygonPoints(i, fullLoadCurve, gearboxData.Gears, + ComputShiftPolygonPoints(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn.SI<Meter>(), out tmp1, out tmp2, out tmp3); upshiftOrig.Add(tmp1); downshiftTransformed.Add(tmp2); - fullLoadCurves.Add(fullLoadCurve); } var imageFile = Path.GetDirectoryName(gearboxFile) + "_" + Path.GetFileNameWithoutExtension(gearboxFile) + "_" + @@ -516,7 +524,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration } } - public static void ComputShiftPolygonPoints(int gear, FullLoadCurve fullLoadCurve, + public static void ComputShiftPolygonPoints(int gear, EngineFullLoadCurve fullLoadCurve, IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius, out List<Point> upshiftOrig, out List<Point> downshiftTransformed, out List<Point> downshiftOrig) { @@ -525,20 +533,20 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration //var engineSpeed85kmhSecondToLastGear = ComputeEngineSpeed85kmh(gears[gears.Count - 2], axlegearRatio, // dynamicTyreRadius, engine); - var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurve.RatedSpeed); + var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurves[0].RatedSpeed); var diffRatio = gears[gears.Count - 2].Ratio / gears[gears.Count - 1].Ratio - 1; - var maxDragTorque = engine.FullLoadCurve.MaxDragTorque * 1.1; + var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1; var p1 = new Point(engine.IdleSpeed.Value() / 2, 0); var p2 = new Point(engine.IdleSpeed.Value() * 1.1, 0); var p3 = new Point(nVHigh.Value() * 0.9, - engine.FullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value()); + fullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value()); var p4 = new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0); - var p5 = new Point(engine.FullLoadCurve.N95hSpeed.Value(), engine.FullLoadCurve.MaxTorque.Value()); + var p5 = new Point(fullLoadCurve.N95hSpeed.Value(), fullLoadCurve.MaxTorque.Value()); var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X)); var p7 = new Point(p4.X, VectoMath.Interpolate(p2, p5, p4.X)); diff --git a/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs index 26dc14cd50..6de65c4b90 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs @@ -70,7 +70,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation public void LossMapValid() { var gearboxData = CreateGearboxData(GearboxDirectLoss, GearboxIndirectLoss); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var axleGearData = CreateAxleGearData(AxleGearLossMap); var vehicleData = new VehicleData { DynamicTyreRadius = 0.85.SI<Meter>(), @@ -107,7 +107,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation public void LossMapInvalidAxle() { var gearboxData = CreateGearboxData(GearboxDirectLoss, GearboxIndirectLoss); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var axleGearData = CreateAxleGearData(GearboxLimited); var runData = new VectoRunData { GearboxData = gearboxData, EngineData = engineData, AxleGearData = axleGearData }; @@ -121,7 +121,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation public void LossMapLimited() { var gearboxData = CreateGearboxData(GearboxLimited, GearboxLimited); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var axleGearData = CreateAxleGearData(AxleGearLossMap); var runData = new VectoRunData { GearboxData = gearboxData, EngineData = engineData, AxleGearData = axleGearData }; var result = VectoRunData.ValidateRunData(runData, new ValidationContext(runData)); @@ -135,7 +135,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation public void LossMapAxleLossMapMissing() { var gearboxData = CreateGearboxData(GearboxDirectLoss, GearboxIndirectLoss); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, gearboxData.Gears.Count); var vehicleData = new VehicleData { DynamicTyreRadius = 0.85.SI<Meter>(), Loading = 0.SI<Kilogram>(), @@ -167,7 +167,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation [TestMethod] public void LossMapGearLossMapMissing() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 0); var axleGearData = CreateAxleGearData(AxleGearLossMap); var runData = new VectoRunData { diff --git a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs index 79128791d6..aaac9863c9 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/MeasuredSpeedModeTest.cs @@ -243,7 +243,11 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation } }, AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } }, - EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad(), FullLoadCurve = fullLoadCurve }, + EngineData = + new CombustionEngineData { + IdleSpeed = 560.RPMtoRad(), + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, fullLoadCurve }, { 1, fullLoadCurve } } + }, GearboxData = new GearboxData { Gears = new Dictionary<uint, GearData> { { 1, new GearData { Ratio = 6.2 } } } }, Retarder = new RetarderData() }; @@ -299,7 +303,15 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation CrossWindCorrectionMode.NoCorrection) }, AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } }, - EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad(), FullLoadCurve = fullLoadCurve }, + EngineData = new CombustionEngineData { + IdleSpeed = 560.RPMtoRad(), + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve> { + { 0, fullLoadCurve }, + { 1, fullLoadCurve }, + { 2, fullLoadCurve }, + { 3, fullLoadCurve } + } + }, GearboxData = new GearboxData { Gears = new Dictionary<uint, GearData> { { 1, new GearData { Ratio = 6.696 } }, diff --git a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs index c91e150469..fcb338353f 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/PwheelModeTests.cs @@ -132,7 +132,11 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var data = new VectoRunData { Cycle = drivingCycle, AxleGearData = new AxleGearData { AxleGear = new GearData { Ratio = 2.3 } }, - EngineData = new CombustionEngineData { IdleSpeed = 560.RPMtoRad(), FullLoadCurve = fullLoadCurve }, + EngineData = + new CombustionEngineData { + IdleSpeed = 560.RPMtoRad(), + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, fullLoadCurve }, { 1, fullLoadCurve } } + }, GearboxData = new GearboxData { Gears = new Dictionary<uint, GearData> { { 2, new GearData { Ratio = 3.5 } } } }, Retarder = new RetarderData() }; diff --git a/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs index 581733901e..20f41fac1a 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/VechicleContainerTests.cs @@ -46,7 +46,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation public void VechicleContainerHasEngine() { var vehicle = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 0); var engine = new CombustionEngine(vehicle, engineData); Assert.IsNotNull(vehicle.EngineSpeed); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs index 17874bf075..b5513a2eb9 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ATGearboxTest.cs @@ -69,10 +69,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent ] public void TestATGearInitialize(double vehicleSpeed, double torque, int expectedGear) { + var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile, false); var vehicleContainer = new MockVehicleContainer(); //(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineDataFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineDataFile, gearboxData.Gears.Count); vehicleContainer.Engine = new CombustionEngine(vehicleContainer, engineData); - var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile, false); var runData = new VectoRunData() { GearboxData = gearboxData }; var gearbox = new ATGearbox(vehicleContainer, new ATShiftStrategy(gearboxData, vehicleContainer), runData); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs index 8b5ed46ee3..71e5b5dc58 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs @@ -69,8 +69,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent double expectedEngineSpeed) { var container = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 1); var gearbox = new MockGearbox(container); + gearbox.Gear = 0; var clutch = new Clutch(container, engineData) { IdleController = new MockIdleController() }; var vehicle = new MockVehicle(container); vehicle.MyVehicleSpeed = 50.KMPHtoMeterPerSecond(); @@ -96,8 +97,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent public void ClutchContinuityTest() { var container = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 1); var gearbox = new MockGearbox(container); + gearbox.Gear = 1; var engine = new MockEngine(container); var clutch = new Clutch(container, engineData) { IdleController = new MockIdleController() }; diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs index c15e0c7a63..2a146114e3 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs @@ -65,7 +65,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent public void TestEngineHasOutPort() { var vehicle = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 0); var engine = new CombustionEngine(vehicle, engineData); var port = engine.OutPort(); @@ -76,7 +76,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent public void TestOutPortRequestNotFailing() { var vehicle = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 0); var engine = new CombustionEngine(vehicle, engineData); var port = engine.OutPort(); @@ -94,7 +94,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent public void TestSimpleModalData() { var vehicle = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine,0); var engine = new CombustionEngine(vehicle, engineData); var port = engine.OutPort(); @@ -162,7 +162,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent double finalIdleLoad, string resultFile) { var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 0); var engine = new EngineOnlyCombustionEngine(vehicleContainer, engineData); var expectedResults = VectoCSVFile.Read(resultFile); @@ -187,7 +187,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var i = 0; // dt = TimeSpan.FromSeconds(double.Parse(TestContext.DataRow["dt"].ToString(), CultureInfo.InvariantCulture)); // dt = TimeSpan.FromSeconds(expectedResults.Rows[i].ParseDouble(0)) - t; - var engineLoadPower = engineData.FullLoadCurve.FullLoadStationaryPower(angularSpeed); + var engineLoadPower = engineData.FullLoadCurves[0].FullLoadStationaryPower(angularSpeed); idlePower = finalIdleLoad.SI<Watt>(); for (; t < 25; t += dt, i++) { dt = (expectedResults.Rows[i + 1].ParseDouble(0) - expectedResults.Rows[i].ParseDouble(0)).SI<Second>(); @@ -218,7 +218,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent double finalIdleLoad, string resultFile) { var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 0); var engine = new CombustionEngine(vehicleContainer, engineData); var expectedResults = VectoCSVFile.Read(resultFile); @@ -243,7 +243,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var i = 0; // dt = TimeSpan.FromSeconds(double.Parse(TestContext.DataRow["dt"].ToString(), CultureInfo.InvariantCulture)); // dt = TimeSpan.FromSeconds(expectedResults.Rows[i].ParseDouble(0)) - t; - var engineLoadPower = engineData.FullLoadCurve.FullLoadStationaryPower(angularSpeed); + var engineLoadPower = engineData.FullLoadCurves[0].FullLoadStationaryPower(angularSpeed); idlePower = finalIdleLoad.SI<Watt>(); for (; t < 25; t += dt, i++) { dt = (expectedResults.Rows[i + 1].ParseDouble(0) - expectedResults.Rows[i].ParseDouble(0)).SI<Second>(); @@ -267,7 +267,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent { var container = new VehicleContainer(ExecutionMode.Engineering); var gearbox = new MockGearbox(container); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 1); var vehicle = new MockVehicle(container); vehicle.MyVehicleSpeed = 0.SI<MeterPerSecond>(); var engine = new CombustionEngine(container, engineData); @@ -422,7 +422,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent 5000, 5000, 5000, 5000, 5000, 5000, 5000 }; - var fld = engine.ModelData.FullLoadCurve; + var fld = engine.ModelData.FullLoadCurves; gearbox.SetClutch(false); var engSpeedResults = new List<dynamic>(); @@ -458,7 +458,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var angularVelocity = 95.5596.SI<PerSecond>(); - var torque = (engine.ModelData.FullLoadCurve.DragLoadStationaryPower(angularVelocity) - 5000.SI<Watt>()) / + var torque = (engine.ModelData.FullLoadCurves[0].DragLoadStationaryPower(angularVelocity) - 5000.SI<Watt>()) / angularVelocity; var response = (ResponseSuccess)requestPort.Initialize(torque, angularVelocity); @@ -502,7 +502,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent [TestCase] public void Test_EngineData() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(CoachEngine, 0); var motorway = engineData.WHTCMotorway; Assert.AreEqual(motorway, 1); @@ -530,7 +530,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent { container = new VehicleContainer(ExecutionMode.Engineering); gearbox = new MockGearbox(container); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineFile, 1); engine = new CombustionEngine(container, engineData); var clutch = new Clutch(container, engineData); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs index efc16d5959..2c94ef86a3 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs @@ -64,8 +64,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent [TestMethod] public void DriverCoastingTest() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); - + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1); + var vehicleData = CreateVehicleData(33000.SI<Kilogram>()); vehicleData.DynamicTyreRadius = 0.026372213.SI<Meter>(); // take into account axle ratio, gear ratio @@ -121,7 +121,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent [TestMethod] public void DriverCoastingTest2() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFile, 1); var vehicleData = CreateVehicleData(33000.SI<Kilogram>()); vehicleData.DynamicTyreRadius = 0.026372213.SI<Meter>(); // take into account axle ratio, gear ratio @@ -180,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent [TestMethod] public void DriverOverloadTest() { - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFileHigh); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFileHigh, 1); var vehicleData = CreateVehicleData(33000.SI<Kilogram>()); @@ -206,6 +206,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer); + gbx.Gear = 1; var driverPort = driver.OutPort(); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs index 336323a26a..c3cf7d1fb3 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs @@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent vehicle.MyVehicleSpeed = 10.KMPHtoMeterPerSecond(); driver.DriverBehavior = DrivingBehavior.Driving; var engine = new CombustionEngine(container, - MockSimulationDataFactory.CreateEngineDataFromFile(ATPowerTrain.EngineFile)); + MockSimulationDataFactory.CreateEngineDataFromFile(ATPowerTrain.EngineFile, gearboxData.Gears.Count)); container.Engine = engine; var runData = new VectoRunData() { GearboxData = gearboxData, diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs index 21edf9ef5d..d902ff6958 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs @@ -30,6 +30,7 @@ */ using System; +using System.Collections.Generic; using System.Linq; using NUnit.Framework; using TUGraz.VectoCommon.Exceptions; @@ -38,6 +39,7 @@ using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; @@ -85,14 +87,14 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent return new GearboxData { Gears = ratios.Select((ratio, i) => - Tuple.Create((uint)i, - new GearData { + Tuple.Create((uint)i, + new GearData { // MaxTorque = 2300.SI<NewtonMeter>(), - LossMap = TransmissionLossMapReader.ReadFromFile(i != 6 ? IndirectLossMap : DirectLossMap, ratio, - string.Format("Gear {0}", i)), - Ratio = ratio, - ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile) - })) + LossMap = TransmissionLossMapReader.ReadFromFile(i != 6 ? IndirectLossMap : DirectLossMap, ratio, + string.Format("Gear {0}", i)), + Ratio = ratio, + ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile) + })) .ToDictionary(k => k.Item1 + 1, v => v.Item2), ShiftTime = 2.SI<Second>(), Inertia = 0.SI<KilogramSquareMeter>(), @@ -243,6 +245,20 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent "2000.000001,1352,-301,0.25", "2100,1100,-320,0.25 ", }; + var engineData = new CombustionEngineData() { + IdleSpeed = 600.RPMtoRad(), + Inertia = 0.SI<KilogramSquareMeter>(), + }; + var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(); + fullLoadCurves[0] = EngineFullLoadCurve.Create( + VectoCSVFile.ReadStream( + InputDataHelper.InputDataAsStream("engine speed [1/min],full load torque [Nm],motoring torque [Nm],PT1 [s]", + fld))); + fullLoadCurves[0].EngineData = engineData; + foreach (var gears in gearboxData.Gears) { + fullLoadCurves[gears.Key] = fullLoadCurves[0]; + } + engineData.FullLoadCurves = fullLoadCurves; return new VectoRunData() { VehicleData = new VehicleData() { DynamicTyreRadius = 0.492.SI<Meter>() @@ -252,15 +268,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent Ratio = 2.64 } }, - EngineData = new CombustionEngineData() { - IdleSpeed = 600.RPMtoRad(), - Inertia = 0.SI<KilogramSquareMeter>(), - FullLoadCurve = - EngineFullLoadCurve.Create( - VectoCSVFile.ReadStream( - InputDataHelper.InputDataAsStream("engine speed [1/min],full load torque [Nm],motoring torque [Nm],PT1 [s]", - fld))) - }, + EngineData = engineData, GearboxData = gearboxData }; } diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs index 1521da0688..8a03c5cb6e 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs @@ -125,7 +125,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData AssertHelper.AreRelativeEqual(194.515816596908.SI<PerSecond>(), fldCurve.N95hSpeed); AssertHelper.AreRelativeEqual(83.81645.SI<PerSecond>(), fldCurve.LoSpeed); AssertHelper.AreRelativeEqual(219.084329211505.SI<PerSecond>(), fldCurve.HiSpeed); - AssertHelper.AreRelativeEqual(2300.SI<NewtonMeter>(), fldCurve.MaxLoadTorque); + AssertHelper.AreRelativeEqual(2300.SI<NewtonMeter>(), fldCurve.MaxTorque); AssertHelper.AreRelativeEqual(-320.SI<NewtonMeter>(), fldCurve.MaxDragTorque); } @@ -244,7 +244,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData public void FullLoad_LossMap_Test() { var engineData = new CombustionEngineData { - FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"), + FullLoadCurves = + new Dictionary<uint, EngineFullLoadCurve>() { + { 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") } + }, IdleSpeed = 560.RPMtoRad() }; diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs index 89828edd24..8198eac486 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs @@ -89,10 +89,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData WHTCUrban = 1, WHTCRural = 1, WHTCMotorway = 1, - FullLoadCurve = EngineFullLoadCurve.Create(fullLoad), + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { { 0, EngineFullLoadCurve.Create(fullLoad) } }, ConsumptionMap = FuelConsumptionMapReader.Create(fuelConsumption) }; - data.FullLoadCurve.EngineData = data; + data.FullLoadCurves[0].EngineData = data; var results = data.Validate(ExecutionMode.Declaration, null, false); Assert.IsFalse(results.Any(), "Validation Failed: " + string.Join("; ", results.Select(r => r.ErrorMessage))); @@ -127,7 +127,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData }; var dao = new EngineeringDataAdapter(); - var engineData = dao.CreateEngineData(data, null); + var engineData = dao.CreateEngineData(data, null, new List<ITorqueLimitInputData>()); var results = engineData.Validate(ExecutionMode.Declaration, null, false); Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage))); @@ -165,7 +165,12 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData }; var dao = new DeclarationDataAdapter(); - var engineData = dao.CreateEngineData(data, GearboxType.AMT); + var dummyGearbox = new DummyGearboxData() { + Type = GearboxType.AMT, + Gears = new List<ITransmissionInputData>() + }; + + var engineData = dao.CreateEngineData(data, dummyGearbox, new List<ITorqueLimitInputData>()); var results = engineData.Validate(ExecutionMode.Declaration, null, false); Assert.IsFalse(results.Any(), "Validation failed: " + string.Join("; ", results.Select(r => r.ErrorMessage))); @@ -223,7 +228,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var container = new VehicleContainer(ExecutionMode.Engineering); var data = new DistanceRun(container); var engineData = new CombustionEngineData { - FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"), + FullLoadCurves = + new Dictionary<uint, EngineFullLoadCurve>() { + { 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + }, IdleSpeed = 560.RPMtoRad() }; @@ -244,7 +253,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData Creator = "Mr. Test", CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection, CrossWindCorrectionCurve = - new CrosswindCorrectionCdxALookup(5.SI<SquareMeter>(),CrossWindCorrectionCurveReader.GetNoCorrectionCurve(5.SI<SquareMeter>()), + new CrosswindCorrectionCdxALookup(5.SI<SquareMeter>(), + CrossWindCorrectionCurveReader.GetNoCorrectionCurve(5.SI<SquareMeter>()), CrossWindCorrectionMode.NoCorrection), CurbWeight = 7500.SI<Kilogram>(), DynamicTyreRadius = 0.5.SI<Meter>(), @@ -293,7 +303,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var container = new VehicleContainer(ExecutionMode.Engineering); var data = new DistanceRun(container); var engineData = new CombustionEngineData { - FullLoadCurve = EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld"), + FullLoadCurves = + new Dictionary<uint, EngineFullLoadCurve>() { + { 0, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") }, + { 1, EngineFullLoadCurve.ReadFromFile(@"TestData\Components\12t Delivery Truck.vfld") } + }, IdleSpeed = 560.RPMtoRad() }; @@ -602,4 +616,33 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData } } } + + public class DummyGearboxData : IGearboxEngineeringInputData + { + public DataSourceType SourceType { get; set; } + public string Source { get; set; } + public bool SavedInDeclarationMode { get; set; } + public string Manufacturer { get; set; } + public string Model { get; set; } + public string Creator { get; set; } + public string Date { get; set; } + public string TechnicalReportId { get; set; } + public string CertificationNumber { get; set; } + public string DigestValue { get; set; } + public IntegrityStatus IntegrityStatus { get; set; } + public GearboxType Type { get; set; } + public IList<ITransmissionInputData> Gears { get; set; } + public KilogramSquareMeter Inertia { get; set; } + public Second TractionInterruption { get; set; } + public Second MinTimeBetweenGearshift { get; set; } + public double TorqueReserve { get; set; } + public MeterPerSecond StartSpeed { get; set; } + public MeterPerSquareSecond StartAcceleration { get; set; } + public double StartTorqueReserve { get; set; } + public ITorqueConverterEngineeringInputData TorqueConverter { get; set; } + public Second DownshiftAfterUpshiftDelay { get; set; } + public Second UpshiftAfterDownshiftDelay { get; set; } + public MeterPerSquareSecond UpshiftMinAcceleration { get; set; } + public Second PowershiftShiftTime { get; set; } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs index 560d2e5699..2b311ee128 100644 --- a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs +++ b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs @@ -74,7 +74,7 @@ namespace TUGraz.VectoCore.Tests.Reports var sumData = new SummaryDataContainer(null); var run = Truck40tPowerTrain.CreateEngineeringRun(cycle, "Truck_ModDataIntegrity.vmod"); - var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(Truck40tPowerTrain.EngineFile); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(Truck40tPowerTrain.EngineFile, 0); // get a reference to the mod-data because the modaldata container clears it after simulation var modData = ((ModalDataContainer)run.GetContainer().ModalData).Data; diff --git a/VectoCore/VectoCoreTest/Utils/MockRunData.cs b/VectoCore/VectoCoreTest/Utils/MockRunData.cs index 0a07672cb4..dcb7af96af 100644 --- a/VectoCore/VectoCoreTest/Utils/MockRunData.cs +++ b/VectoCore/VectoCoreTest/Utils/MockRunData.cs @@ -63,23 +63,27 @@ namespace TUGraz.VectoCore.Tests.Utils EngineData = new CombustionEngineData() { IdleSpeed = 600.RPMtoRad(), Displacement = 0.SI<CubicMeter>(), - FullLoadCurve = new EngineFullLoadCurve() { - FullLoadEntries = new List<FullLoadCurve.FullLoadCurveEntry>() { - new FullLoadCurve.FullLoadCurveEntry() { - EngineSpeed = 600.RPMtoRad(), - TorqueDrag = -100.SI<NewtonMeter>(), - TorqueFullLoad = 500.SI<NewtonMeter>() - }, - new FullLoadCurve.FullLoadCurveEntry() { - EngineSpeed = 1800.RPMtoRad(), - TorqueDrag = -120.SI<NewtonMeter>(), - TorqueFullLoad = 1200.SI<NewtonMeter>() - }, - new FullLoadCurve.FullLoadCurveEntry() { - EngineSpeed = 2500.RPMtoRad(), - TorqueDrag = -150.SI<NewtonMeter>(), - TorqueFullLoad = 400.SI<NewtonMeter>() - }, + FullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>() { + { + 0, new EngineFullLoadCurve() { + FullLoadEntries = new List<FullLoadCurve.FullLoadCurveEntry>() { + new FullLoadCurve.FullLoadCurveEntry() { + EngineSpeed = 600.RPMtoRad(), + TorqueDrag = -100.SI<NewtonMeter>(), + TorqueFullLoad = 500.SI<NewtonMeter>() + }, + new FullLoadCurve.FullLoadCurveEntry() { + EngineSpeed = 1800.RPMtoRad(), + TorqueDrag = -120.SI<NewtonMeter>(), + TorqueFullLoad = 1200.SI<NewtonMeter>() + }, + new FullLoadCurve.FullLoadCurveEntry() { + EngineSpeed = 2500.RPMtoRad(), + TorqueDrag = -150.SI<NewtonMeter>(), + TorqueFullLoad = 400.SI<NewtonMeter>() + }, + } + } } } }; diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs index 11c1a90055..d37a2d5f52 100644 --- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs +++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs @@ -29,6 +29,7 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System.Collections.Generic; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; @@ -53,12 +54,12 @@ namespace TUGraz.VectoCore.Tests.Utils var engineInput = JSONInputDataFactory.ReadEngine(engineFile); if (declarationMode) { var dao = new DeclarationDataAdapter(); - var engineData = dao.CreateEngineData(engineInput, gearboxInput.Type); + var engineData = dao.CreateEngineData(engineInput, gearboxInput, new List<ITorqueLimitInputData>()); return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(), false); } else { var dao = new EngineeringDataAdapter(); - var engineData = dao.CreateEngineData(engineInput, gearboxInput); + var engineData = dao.CreateEngineData(engineInput, gearboxInput, new List<ITorqueLimitInputData>()); return dao.CreateGearboxData(gearboxInput, engineData, ((IAxleGearInputData)gearboxInput).Ratio, 0.5.SI<Meter>(), true); } @@ -71,11 +72,15 @@ namespace TUGraz.VectoCore.Tests.Utils return dao.CreateAxleGearData((IAxleGearInputData)axleGearInput, false); } - public static CombustionEngineData CreateEngineDataFromFile(string engineFile) + public static CombustionEngineData CreateEngineDataFromFile(string engineFile, int numGears) { var dao = new EngineeringDataAdapter(); var engineInput = JSONInputDataFactory.ReadEngine(engineFile); - return dao.CreateEngineData(engineInput, null); + var engineData = dao.CreateEngineData(engineInput, null, new List<ITorqueLimitInputData>()); + for (uint i = 1; i <= numGears; i++) { + engineData.FullLoadCurves[i] = engineData.FullLoadCurves[0]; + } + return engineData; } public static VehicleData CreateVehicleDataFromFile(string vehicleDataFile) diff --git a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs index 3f20a218b2..82a27e4014 100644 --- a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs +++ b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs @@ -52,7 +52,8 @@ namespace TUGraz.VectoCore.Tests.Utils private static Size _diagramSize = new Size(1000, 800); - public static void DrawShiftPolygons(string title, List<EngineFullLoadCurve> engineFld, List<ShiftPolygon> polygons, + public static void DrawShiftPolygons(string title, Dictionary<uint, EngineFullLoadCurve> engineFld, + List<ShiftPolygon> polygons, string imageFileName, PerSecond speed85kmh, List<List<Point>> upshiftOrig = null, List<List<Point>> downshiftTransformed = null, List<List<Point>> downshiftOrig = null) { @@ -62,7 +63,7 @@ namespace TUGraz.VectoCore.Tests.Utils var chart = new Chart() { Size = new Size((int)(_diagramSize.Width * numCols), (int)(_diagramSize.Height * numRows)) }; - var maxX = engineFld.First().FullLoadEntries.Last().EngineSpeed.Value() / Constants.RPMToRad * 1.1; + var maxX = engineFld[0].FullLoadEntries.Last().EngineSpeed.Value() / Constants.RPMToRad * 1.1; AddLegend(chart); @@ -70,8 +71,8 @@ namespace TUGraz.VectoCore.Tests.Utils foreach (var shiftPolygon in polygons) { var chartArea = AddChartArea(chart, "Gear " + (i + 1), "Engine Speed", "Torque", 0, maxX); - PlotPower(engineFld[i], chartArea, chart, "engine power " + i); - PlotFLD(engineFld[i], speed85kmh, chartArea, chart, "Engine Full Load " + i); + PlotPower(engineFld[(uint)(i + 1)], chartArea, chart, "engine power " + i); + PlotFLD(engineFld[(uint)(i +1)], speed85kmh, chartArea, chart, "Engine Full Load " + i); if (upshiftOrig != null && i < upshiftOrig.Count) { PlotShiftLine("UpshiftOrig " + i, chartArea, chart, Color.Gray, @@ -234,7 +235,7 @@ namespace TUGraz.VectoCore.Tests.Utils new[] { n, n } .ToList(); - var ypref = new[] { engineFld.MaxDragTorque.Value(), engineFld.MaxLoadTorque.Value() }.ToList(); + var ypref = new[] { engineFld.MaxDragTorque.Value(), engineFld.MaxTorque.Value() }.ToList(); chart.Series[seriesNpref.Name].Points.DataBindXY(xpref, ypref); } -- GitLab