diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs index 4178ad665c63d3030e88b6144bf59bf6cfa1ffc1..557e3ef5116017fb1ab137f5eed05df8dfd60bd2 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs @@ -104,14 +104,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox return retVal; } - private double MuLookup(double nu) + private double MuLookup(double speedRatio) { int index; - TorqueConverterEntries.GetSection(x => x.SpeedRatio < nu, out index); - var muEdge = - Edge.Create(new Point(TorqueConverterEntries[index].SpeedRatio, TorqueConverterEntries[index].TorqueRatio), - new Point(TorqueConverterEntries[index + 1].SpeedRatio, TorqueConverterEntries[index + 1].TorqueRatio)); - return muEdge.SlopeXY * nu + muEdge.OffsetXY; + TorqueConverterEntries.GetSection(x => x.SpeedRatio < speedRatio, out index); + var retVal = VectoMath.Interpolate(TorqueConverterEntries[index].SpeedRatio, + TorqueConverterEntries[index + 1].SpeedRatio, TorqueConverterEntries[index].TorqueRatio, + TorqueConverterEntries[index + 1].TorqueRatio, speedRatio); + return retVal; + } + + + private NewtonMeter ReferenceTorqueLookup(double speedRatio) + { + int index; + TorqueConverterEntries.GetSection(x => x.SpeedRatio < speedRatio, out index); + var retVal = VectoMath.Interpolate(TorqueConverterEntries[index].SpeedRatio, + TorqueConverterEntries[index + 1].SpeedRatio, TorqueConverterEntries[index].Torque, + TorqueConverterEntries[index + 1].Torque, speedRatio); + return retVal; } public TorqueConverterOperatingPoint GetOutTorque(PerSecond inAngularVelocity, PerSecond outAngularVelocity) @@ -137,13 +148,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox inAngularVelocity); } - public TorqueConverterOperatingPoint GetOutTorqueAndSpeed(NewtonMeter inTorque, PerSecond inAngularVelocity) + public TorqueConverterOperatingPoint GetOutTorqueAndSpeed(NewtonMeter inTorque, PerSecond inAngularVelocity, + PerSecond outAngularSpeedEstimated) { var referenceTorque = inTorque.Value() / inAngularVelocity.Value() / inAngularVelocity.Value() * ReferenceSpeed.Value() * ReferenceSpeed.Value(); var maxTorque = TorqueConverterEntries.Max(x => x.Torque.Value()); if (referenceTorque.IsGreaterOrEqual(maxTorque)) { - referenceTorque = 0.9 * maxTorque; + referenceTorque = outAngularSpeedEstimated != null + ? ReferenceTorqueLookup(outAngularSpeedEstimated / inAngularVelocity).Value() + : 0.9 * maxTorque; } var solutions = new List<double>(); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs index e48a3bf27c6a1019c686987e37686491008c65c9..049b07ec2d7e7ad9b073b72bea71c8641b2d1078 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs @@ -75,7 +75,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl dryOperatingPoint = ModelData.GetOutTorqueAndSpeed( outTorque > 0 ? engineResponse.EngineMaxTorqueOut : engineResponse.EngineDragTorque, - dryOperatingPoint.InAngularVelocity); + dryOperatingPoint.InAngularVelocity, null); } diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs index 8624da743f3774fc1ac67bec70568aeb5554809e..96190a875f4ee2b95a9f8b9e38f2a1a54d9f06f2 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs @@ -85,7 +85,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad()); - var operatingPoint = tqData.GetOutTorqueAndSpeed(tqIn.SI<NewtonMeter>(), nIn.RPMtoRad()); + var operatingPoint = tqData.GetOutTorqueAndSpeed(tqIn.SI<NewtonMeter>(), nIn.RPMtoRad(), null); Assert.AreEqual(operatingPoint.InTorque.Value(), tqIn, 1e-6); Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), nIn.RPMtoRad().Value(), 1e-6);