diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs index c279598d5c70312a0f0034afd2d1304e46edd5f4..0f98a24421e1113882d69f2dc79944d3df4e6ca1 100644 --- a/VectoCore/VectoCore/Configuration/Constants.cs +++ b/VectoCore/VectoCore/Configuration/Constants.cs @@ -167,6 +167,9 @@ namespace TUGraz.VectoCore.Configuration public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>(); public static Kilogram MaximumGrossVehicleWeight = 40000.SI<Kilogram>(); + + // the torque converter characteristics curve has to be defined up to this speed ratio + public const double RequiredTorqueConverterSpeedRatio = 2.2; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs index 1ff3afffb54cbf06aad79387ab06737484441160..41c075d9273d3073c42a33346c11175be38c779a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs @@ -49,6 +49,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox public PerSecond TorqueConverterSpeedLimit { get; protected internal set; } + // only used for validation! + internal double RequiredSpeedRatio { get; set; } + protected internal TorqueConverterData(List<TorqueConverterEntry> torqueConverterEntries, PerSecond referenceSpeed, PerSecond maxRpm) { @@ -73,7 +76,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox var mpNorm = ReferenceSpeed.Value(); var min = minSpeed == null ? 0 : minSpeed.Value(); - + // Find analytic solution for torque converter operating point // mu = f(nu) = f(n_out / n_in) = T_out / T_in // MP1000 = f(nu) = f(n_out / n_in) @@ -94,7 +97,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox torqueOut.Value(); var sol = VectoMath.QuadraticEquationSolver(a, b, c); - var selected = sol.Where(x => x > min + var selected = sol.Where(x => x > min && angularSpeedOut.Value() / x >= muEdge.P1.X && angularSpeedOut.Value() / x < muEdge.P2.X && angularSpeedOut.Value() / x >= mpEdge.P1.X && angularSpeedOut.Value() / x < mpEdge.P2.X); solutions.AddRange(selected); @@ -253,14 +256,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox return retVal; } + // ReSharper disable once UnusedMember.Global -- used by validation public static ValidationResult ValidateData(TorqueConverterData data, ValidationContext validationContext) { var min = data.TorqueConverterEntries.Min(e => e.SpeedRatio); var max = data.TorqueConverterEntries.Max(e => e.SpeedRatio); - if (min > 0 || max < 2.2) { + if (min > 0 || max < data.RequiredSpeedRatio) { return new ValidationResult(string.Format( - "Torque Converter Data invalid - Speedratio has to cover the range from 0.0 to 2.2: given data only goes from {0} to {1}", - min, max)); + "Torque Converter Data invalid - Speedratio has to cover the range from 0.0 to {2}: given data only goes from {0} to {1}", + min, max, data.RequiredSpeedRatio)); } return ValidationResult.Success; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs index 54445ef1374de3b06d57695c991a1f00168a25cd..8b946ad87b15521969804163a65226742bb3a726 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs @@ -29,12 +29,14 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.Serialization; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; namespace TUGraz.VectoCore.Models.SimulationComponent.Data @@ -111,6 +113,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data var result = new List<ValidationResult>(); if (gearboxData.Type.AutomaticTransmission()) { + gearboxData.TorqueConverterData.RequiredSpeedRatio = + Math.Round(Constants.SimulationSettings.RequiredTorqueConverterSpeedRatio / gearboxData.Gears[1].Ratio * + gearboxData.Gears[1].TorqueConverterRatio, 4); result.AddRange(gearboxData.TorqueConverterData.Validate(mode)); }