diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AverageAccelerationTorquePreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AverageAccelerationTorquePreprocessor.cs index 0af2f0592181e5e3c456e0817ac4ecaa9c233a22..72f7c10fa7be03085c86d6f8c60dafbb436fc97c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AverageAccelerationTorquePreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AverageAccelerationTorquePreprocessor.cs @@ -39,7 +39,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { for (var tmpSpeed = engineSpeed; tmpSpeed < UpperLimit; tmpSpeed += speedStepSize) { sum += VectoMath.Min(torque, fld.FullLoadStationaryTorque(tmpSpeed)); } - entries.Add(new KeyValuePair<Tuple<PerSecond, NewtonMeter>, NewtonMeter>(Tuple.Create(engineSpeed, torque), sum * speedStepSize / (UpperLimit - engineSpeed))); + + var tmp = sum * speedStepSize / (UpperLimit - engineSpeed); + if (engineSpeed.IsEqual(UpperLimit, speedStepSize / 2)) { + tmp = 0.SI<NewtonMeter>(); + } + entries.Add(new KeyValuePair<Tuple<PerSecond, NewtonMeter>, NewtonMeter>(Tuple.Create(engineSpeed, torque), tmp)); } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs index f7973e6889fb02c754cf1dea115d7cad16b1ac61..a11671e6f33fe29ffd81f494443eeb60f9ea4e46 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs @@ -39,21 +39,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { engineSpeed += engineSpeedSteps) { var maxTorque = Data.EngineData.FullLoadCurves[gearData.Key].FullLoadStationaryTorque(engineSpeed); var vehicleSpeed = engineSpeed * powertrainRatioWOGearbox / gearData.Value.Ratio; - var first = TestContainer.VehiclePort.Initialize(vehicleSpeed, 0.SI<Radian>()); - var delta = first.EngineTorqueDemandTotal - maxTorque; - var grad = SearchAlgorithm.Search( - 0.SI<Radian>(), delta, 0.1.SI<Radian>(), - getYValue: r => { - return ((r as AbstractResponse).EngineTorqueDemandTotal - maxTorque); - }, - evaluateFunction: g => { - return TestContainer.VehiclePort.Initialize(vehicleSpeed, g); - }, - criterion: r => { - return ((r as AbstractResponse).EngineTorqueDemandTotal - maxTorque).Value(); - } - ); + + var grad = VectoMath.InclinationToAngle(1); var max = TestContainer.VehiclePort.Initialize(vehicleSpeed, grad); + if ((max.EngineTorqueDemandTotal - maxTorque).IsGreater(0)) { + + var first = TestContainer.VehiclePort.Initialize(vehicleSpeed, 0.SI<Radian>()); + var delta = first.EngineTorqueDemandTotal - maxTorque; + grad = SearchAlgorithm.Search( + 0.SI<Radian>(), delta, 0.1.SI<Radian>(), + getYValue: r => { + return ((r as AbstractResponse).EngineTorqueDemandTotal - maxTorque); + }, + evaluateFunction: g => { + return TestContainer.VehiclePort.Initialize(vehicleSpeed, g); + }, + criterion: r => { + return ((r as AbstractResponse).EngineTorqueDemandTotal - maxTorque).Value(); + } + ); + max = TestContainer.VehiclePort.Initialize(vehicleSpeed, grad); + } retVal[gearData.Key].Add(new KeyValuePair<PerSecond, NewtonMeter>(max.EngineSpeed, max.CardanTorque)); } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxGradabilityPreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxGradabilityPreprocessor.cs index 6b8ed9f50f4b865cbb459f01b704d5be03082eb6..e71807b8ebceafd4c1adc00305e92c0ca2979819 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxGradabilityPreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxGradabilityPreprocessor.cs @@ -73,6 +73,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { private Radian SearchGradient(Vehicle vehicle, MeterPerSecond vehicleSpeed, NewtonMeter maxTorque) { + var gradientMax = VectoMath.InclinationToAngle(1); + var responseMax = vehicle.Initialize(vehicleSpeed, gradientMax); + var deltaMax = responseMax.EnginePowerRequest / responseMax.EngineSpeed - maxTorque; + if (deltaMax.IsSmaller(0)) { + return gradientMax; + } + var gradient = VectoMath.InclinationToAngle(0); var response = vehicle.Initialize(vehicleSpeed, gradient); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs index 8abe7156695902a4da022c9ed7900d169588e2a3..767400bf9cda3cc9ba65553db5fcd8995259b24e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs @@ -74,6 +74,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var gearForSpeed = runData.GearboxData.Gears.FirstOrDefault( x => (speed * ratio * x.Value.Ratio).IsBetween( runData.EngineData.IdleSpeed, runData.EngineData.FullLoadCurves[0].RatedSpeed)).Key; + if (gearForSpeed == 0) { + continue; + } for (var grad = MinGradient; grad <= MaxGradient; grad += GradientStep) { var gradient = VectoMath.InclinationToAngle(grad / 100.0); gearbox.Disengaged = false;