diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index 477ec7b5cd4435dd4b1c2ff7529fa63a0841928b..31e770803a5dc23b8a37bbfa53829e9fa43ac78e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -218,6 +218,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; var inTorqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque); + if (avgOutAngularVelocity.IsEqual(0, 1e-9)) { + inTorqueLossResult.Value = 0.SI<NewtonMeter>(); + } var inTorque = outTorque / ModelData.Gears[gear].Ratio + inTorqueLossResult.Value; var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio; @@ -411,12 +414,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (CurrentState.TorqueLossResult != null && CurrentState.TorqueLossResult.Extrapolated) { Log.Warn( "Gear {0} LossMap data was extrapolated: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}", - Gear, CurrentState.OutAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.OutTorque, + Gear, CurrentState.OutAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.OutTorque, ModelData.Gears[Gear].Ratio); if (DataBus.ExecutionMode == ExecutionMode.Declaration) { throw new VectoException( "Gear {0} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{1}, torque:{2}, ratio:{3}", - Gear, CurrentState.InAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.InTorque, + Gear, CurrentState.InAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.InTorque, ModelData.Gears[Gear].Ratio); } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Retarder.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Retarder.cs index 320fd9195dfa9fe8f4442d664e2aa6778e2147dd..f72c63bad8e106e335a86a1b976f78af19211840 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Retarder.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Retarder.cs @@ -61,6 +61,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { _lossMap = lossMap; _ratio = ratio; + _primaryRetarder = container.RunData != null && container.RunData.Retarder.Type == RetarderType.TransmissionInputRetarder; } public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity) @@ -76,7 +77,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return NextComponent.Request(absTime, dt, torque, angularVelocity, dryRun); } var avgAngularSpeed = (PreviousState.InAngularVelocity + angularVelocity) / 2.0; - var retarderTorqueLoss = _lossMap.GetTorqueLoss(avgAngularSpeed * _ratio) * _ratio; + var retarderTorqueLoss = avgAngularSpeed.IsEqual(0, 1e-9) ? 0.SI<NewtonMeter>() : _lossMap.GetTorqueLoss(avgAngularSpeed * _ratio) * _ratio; CurrentState.SetState(torque + retarderTorqueLoss, angularVelocity, torque, angularVelocity); return NextComponent.Request(absTime, dt, CurrentState.InTorque, CurrentState.InAngularVelocity, dryRun); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs index 6eaea024e817638f72b59464afd4779e72a5fa3f..4068e1ed60fbf3422aadec6e5908b14f65d5f783 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TransmissionComponent.cs @@ -80,6 +80,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; var torqueLossResult = ModelData.LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque); + if (avgOutAngularVelocity.IsEqual(0, 1e-9)) { + torqueLossResult.Value = 0.SI<NewtonMeter>(); + } var inTorque = outTorque / ModelData.Ratio + torqueLossResult.Value; CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); @@ -105,12 +108,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { if (CurrentState.TorqueLossResult.Extrapolated) { Log.Warn("{2} LossMap data was extrapolated: range for loss map is not sufficient: n:{0}, torque:{1}", - CurrentState.OutAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.OutTorque, GetType().Name); + CurrentState.OutAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.OutTorque, GetType().Name); if (DataBus.ExecutionMode == ExecutionMode.Declaration) { throw new VectoException( "{2} LossMap data was extrapolated in Declaration Mode: range for loss map is not sufficient: n:{0}, torque:{1}", - CurrentState.OutAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.OutTorque, GetType().Name); + CurrentState.OutAngularVelocity.ConvertToRoundsPerMinute(), CurrentState.OutTorque, GetType().Name); } } AdvanceState(); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs index 8bacad4cfdb0347ab9afce2c4371d8bfda373ac8..7e079e472c033ab1375a2d3fb85454a2675a3b46 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Vehicle.cs @@ -107,7 +107,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CurrentState.Distance = PreviousState.Distance + PreviousState.Velocity * dt + acceleration * dt * dt / 2; CurrentState.DriverAcceleration = DriverAcceleration(acceleration); - CurrentState.RollingResistance = RollingResistance(gradient); + CurrentState.RollingResistance = (PreviousState.Velocity + CurrentState.Velocity).IsEqual(0, 1e-9) ? 0.SI<Newton>() : RollingResistance(gradient); try { CurrentState.AirDragResistance = AirDragResistance(PreviousState.Velocity, CurrentState.Velocity); } catch (VectoException ex) {