diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index a7b16787757996e2efd3d646e0558c3ab0f93731..ea51b256a7fa1c796a279f70ce4b20ac16b4f313 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -222,11 +222,16 @@ namespace TUGraz.VectoCommon.InputData /// </summary> double Efficiency { get; } + ///// <summary> + ///// P145 + ///// cf. VECTO Input Parameters.xlsx + ///// </summary> + //DataTable FullLoadCurve { get; } // deprecated + /// <summary> - /// P145 - /// cf. VECTO Input Parameters.xlsx + /// P157 /// </summary> - DataTable FullLoadCurve { get; } + NewtonMeter MaxTorque { get; } /// <summary> /// P082 diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs index 1cfe8719a168804e05cc0b5b8cbcfd0520def170..692ab39d2edb7bb06c497bab775ad82e1f45f5bf 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs @@ -149,9 +149,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON var inputData = new TransmissionInputData { Gear = i, Ratio = gear.GetEx<double>(JsonKeys.Gearbox_Gear_Ratio), - FullLoadCurve = - ReadTableData(gear.GetEx<string>(JsonKeys.Gearbox_Gear_FullLoadCurveFile), string.Format("Gear {0} FLD", i), - false), + MaxTorque = gear["MaxTorque"] != null ? gear["MaxTorque"].Value<double>().SI<NewtonMeter>() : null, LossMap = gear[JsonKeys.Gearbox_Gear_LossMapFile] != null ? ReadTableData(gear.GetEx<string>(JsonKeys.Gearbox_Gear_LossMapFile), string.Format("Gear {0} LossMap", i)) diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs index f8885121f9aa09a4caa9b2b84b6621f491e24474..a142e60497c3d61b6f75f6634f05c67894237c12 100644 --- a/VectoCore/VectoCore/InputData/Impl/InputData.cs +++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs @@ -91,7 +91,7 @@ namespace TUGraz.VectoCore.InputData.Impl public double Efficiency { get; internal set; } - public DataTable FullLoadCurve { get; internal set; } + public NewtonMeter MaxTorque { get; internal set; } public DataTable ShiftPolygon { get; internal set; } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index bf9bab60dc1fb268ce6f39d51c65830269943d6b..f553bb0567e72133b984dc82185e379cf3a73881 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -231,22 +231,53 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter /// <param name="engineCurve"></param> /// <param name="gearCurve"></param> /// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns> - internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, FullLoadCurve gearCurve) + internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, NewtonMeter maxTorque) { - if (gearCurve == null) { + if (maxTorque == null) { return engineCurve; } - // TODO mk-2016-04-18: refactor when new gearbox full load is implemented: gearbox will then only have 1 constant value as full load. - var entries = - gearCurve.FullLoadEntries.Concat(engineCurve.FullLoadEntries) - .OrderBy(x => x.EngineSpeed) - .DistinctBy((x, y) => x.EngineSpeed.Value().IsEqual(y.EngineSpeed.Value())) - .Select(x => new FullLoadCurve.FullLoadCurveEntry { - EngineSpeed = x.EngineSpeed, - TorqueFullLoad = - VectoMath.Min(engineCurve.FullLoadStationaryTorque(x.EngineSpeed), - gearCurve.FullLoadStationaryTorque(x.EngineSpeed)) + + var entries = new List<FullLoadCurve.FullLoadCurveEntry>(); + var firstEntry = engineCurve.FullLoadEntries.First(); + if (firstEntry.TorqueFullLoad < maxTorque) { + entries.Add(engineCurve.FullLoadEntries.First()); + } else { + entries.Add(new FullLoadCurve.FullLoadCurveEntry { + EngineSpeed = firstEntry.EngineSpeed, + TorqueFullLoad = maxTorque, + TorqueDrag = firstEntry.TorqueDrag + }); + } + foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create)) { + if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque) { + // segment is below maxTorque line -> use directly + entries.Add(entry.Item2); + } else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque) { + // segment is above maxTorque line -> add limited entry + entries.Add(new FullLoadCurve.FullLoadCurveEntry { + EngineSpeed = entry.Item2.EngineSpeed, + TorqueFullLoad = maxTorque, + TorqueDrag = entry.Item2.TorqueDrag + }); + } else { + // segment intersects maxTorque line -> add new entry at intersection + var edgeFull = Edge.Create(new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueFullLoad.Value()), + new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueFullLoad.Value())); + var edgeDrag = Edge.Create(new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueDrag.Value()), + new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueDrag.Value())); + var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; + entries.Add(new FullLoadCurve.FullLoadCurveEntry { + EngineSpeed = intersectionX.SI<PerSecond>(), + TorqueFullLoad = maxTorque, + TorqueDrag = VectoMath.Interpolate(edgeDrag.P1, edgeDrag.P2, intersectionX).SI<NewtonMeter>() }); + entries.Add(new FullLoadCurve.FullLoadCurveEntry { + EngineSpeed = entry.Item2.EngineSpeed, + TorqueFullLoad = entry.Item2.TorqueFullLoad > maxTorque ? maxTorque : entry.Item2.TorqueFullLoad, + TorqueDrag = entry.Item2.TorqueDrag + }); + } + } var flc = new EngineFullLoadCurve { FullLoadEntries = entries.ToList(), diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index f12161712d71cd2e60db62578bc751c9cf134ab6..a4a2384419d4d7935256f0492d6985973e9082c3 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -203,11 +203,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter throw; } } - var gearFullLoad = gear.FullLoadCurve == null - ? null - : FullLoadCurveReader.Create(gear.FullLoadCurve, true); - var fullLoadCurve = IntersectFullLoadCurves(engine.FullLoadCurve, gearFullLoad); + var fullLoadCurve = IntersectFullLoadCurves(engine.FullLoadCurve, gear.MaxTorque); var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gears, engine, axlegearRatio, dynamicTyreRadius); @@ -215,7 +212,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter new GearData { LossMap = gearLossMap, ShiftPolygon = shiftPolygon, - FullLoadCurve = gearFullLoad, + MaxTorque = gear.MaxTorque, Ratio = gear.Ratio, TorqueConverterActive = false }); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 39be1dacac81845c3194c7eba3b5fd7bdd65e165..223e245d2b91ea465368c4fd18a7a3ef2ddfd67b 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -149,10 +149,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } else { throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1); } - var gearFullLoad = gear.FullLoadCurve != null - ? FullLoadCurveReader.Create(gear.FullLoadCurve) - : null; - var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gearFullLoad); + + var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque); var shiftPolygon = gear.ShiftPolygon != null ? ShiftPolygonReader.Create(gear.ShiftPolygon) : DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gears, engineData, axlegearRatio, dynamicTyreRadius); @@ -160,7 +158,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return new KeyValuePair<uint, GearData>((uint)(i + 1), new GearData { LossMap = lossMap, ShiftPolygon = shiftPolygon, - FullLoadCurve = gearFullLoad, + MaxTorque = gear.MaxTorque, Ratio = gear.Ratio, TorqueConverterActive = gear.TorqueConverterActive }); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs index 4ace802b074c43cbc7bb30bc325e9d9833aebe3a..c6eea8806a7b34b36fe1ed22da8c5d2dae487dc8 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs @@ -51,7 +51,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox [ValidateObject] public FullLoadCurve FullLoadCurve { get; internal set; } - // TODO mk-2016-05-09: Refactor TorqueConverterActive Flag when implementing Torque Converter public bool TorqueConverterActive { get; internal set; } + + public NewtonMeter MaxTorque { get; internal set; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 9397a36169da40d0a77fc8ef22706b3a9e62ba6f..6280561b3c874111f6d5ec89dd777b69c131f86b 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -136,6 +136,7 @@ <Compile Include="InputData\Reader\ComponentData\TransmissionLossMapReader.cs" /> <Compile Include="InputData\Reader\ComponentData\RetarderLossMapReader.cs" /> <Compile Include="InputData\Reader\ComponentData\TorqueConverterDataReader.cs" /> + <Compile Include="Models\SimulationComponent\Data\Engine\FuelConsumptionMapReader.cs" /> <Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" /> <Compile Include="Utils\ProviderExtensions.cs" /> <Compile Include="Models\Declaration\AirDrag.cs" /> diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs index 2439bc19abaaf21d749a9c437134307a7d17710a..e13422105359ab3efa6e5773f9d50f55fa68403d 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs @@ -301,18 +301,12 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData "2000, 1352, -301", "2100, 1100, -320", }; - var gbxFldString = new[] { - "560, 2500", - "2100, 2500" - }; var dataEng = VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm]", engineFldString)); var engineFld = EngineFullLoadCurve.Create(dataEng, true); - var dataGbx = VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm]", gbxFldString)); - var gbxFld = FullLoadCurveReader.Create(dataGbx, true); - var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFld, gbxFld); + var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFld, 2500.SI<NewtonMeter>()); Assert.AreEqual(10, fullLoadCurve.FullLoadEntries.Count);