diff --git a/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs b/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs index 06b705c1cf8938569684f16dc04bfb5993c5441c..579937a717c7c96df841874d5e3bc131b8f5e196 100644 --- a/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs +++ b/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs @@ -33,7 +33,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox private readonly double _ratio; /// <summary> - /// The Loss map. [X=Input EngineSpeed, Y=Output Torque] => Z=Input Torque + /// The Loss map. [X=Output EngineSpeed, Y=Output Torque] => Z=Torque Loss /// </summary> private readonly DelauneyMap _lossMap; @@ -131,8 +131,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox _invertedLossMap = new DelauneyMap(); foreach (var entry in _entries) { var outTorque = (entry.InputTorque - entry.TorqueLoss) * _ratio; - - _lossMap.AddPoint(entry.InputSpeed.Value(), outTorque.Value(), entry.TorqueLoss.Value()); + var outSpeed = entry.InputSpeed.Value() / _ratio; + _lossMap.AddPoint(outSpeed, outTorque.Value(), entry.TorqueLoss.Value()); _invertedLossMap.AddPoint(entry.InputSpeed.Value(), entry.InputTorque.Value(), entry.TorqueLoss.Value()); } @@ -142,20 +142,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox /// <summary> - /// Computes the INPUT torque given by the input-engineSpeed and the output-torque. + /// Computes the torque loss (input side) given by the output gearbox speed and the output-torque. /// </summary> - /// <param name="inAngularVelocity">Angular speed at input side.</param> + /// <param name="outAngularVelocity">Angular speed at output side.</param> /// <param name="outTorque">Torque at output side (as requested by the previous componend towards the wheels).</param> - /// <returns>Torque needed at input side (towards the engine).</returns> - public NewtonMeter GetInTorque(PerSecond inAngularVelocity, NewtonMeter outTorque) + /// <returns>Torque loss as seen on input side (towards the engine).</returns> + public NewtonMeter GetTorqueLoss(PerSecond outAngularVelocity, NewtonMeter outTorque) { - var torqueLoss = _lossMap.Interpolate(inAngularVelocity.Value(), outTorque.Value(), true).SI<NewtonMeter>(); - - var inTorque = outTorque / _ratio + torqueLoss; + var torqueLoss = _lossMap.Interpolate(outAngularVelocity.Value(), outTorque.Value(), true).SI<NewtonMeter>(); - Log.Debug("GearboxLoss {0}: {1}, inAngularVelocity: {2}, outTorque: {3}", GearName, torqueLoss, - inAngularVelocity, outTorque); - return inTorque; + Log.Debug("GearboxLoss {0}: {1}, outAngularVelocity: {2}, outTorque: {3}", GearName, torqueLoss, + outAngularVelocity, outTorque); + return torqueLoss; } /// <summary> diff --git a/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs b/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs index f6c3797cddc123c209eb1e568566ee74137cd129..0b272421f821c69a68539c6d84d1fba2abadfa97 100644 --- a/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs +++ b/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs @@ -62,9 +62,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Log.Debug("request: torque: {0}, angularVelocity: {1}", torque, angularVelocity); var inAngularVelocity = angularVelocity * ModelData.AxleGear.Ratio; - var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0; + var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + angularVelocity) / 2.0; - var inTorque = ModelData.AxleGear.LossMap.GetInTorque(avgInAngularVelocity, torque); + var torqueLoss = ModelData.AxleGear.LossMap.GetTorqueLoss(avgOutAngularVelocity, torque); + var inTorque = torque / ModelData.AxleGear.Ratio + torqueLoss; CurrentState.SetState(inTorque, inAngularVelocity, torque, angularVelocity); @@ -77,7 +78,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity) { var inAngularVelocity = angularVelocity * ModelData.AxleGear.Ratio; - var inTorque = ModelData.AxleGear.LossMap.GetInTorque(inAngularVelocity, torque); + var torqueLoss = ModelData.AxleGear.LossMap.GetTorqueLoss(angularVelocity, torque); + var inTorque = torque / ModelData.AxleGear.Ratio + torqueLoss; PreviousState.SetState(inTorque, inAngularVelocity, torque, angularVelocity); diff --git a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index 32b3a9bac222d6c5a8bc5ab32d8b6815838d438f..73c862dbe06b4255a8e4733265dddbf44896d464 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -129,8 +129,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio; - var inTorque = ModelData.Gears[Gear].LossMap.GetInTorque(inAngularVelocity, outTorque); - + var torqueLoss = ModelData.Gears[Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); + var inTorque = outTorque / ModelData.Gears[Gear].Ratio + torqueLoss; var torqueLossInertia = outAngularVelocity.IsEqual(0) ? 0.SI<NewtonMeter>() : Formulas.InertiaPower(inAngularVelocity, PreviousState.InAngularVelocity, ModelData.Inertia, dt) / @@ -141,12 +141,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); PreviousState.InertiaTorqueLossOut = 0.SI<NewtonMeter>(); PreviousState.Gear = Gear; + Disengaged = false; var response = NextComponent.Initialize(inTorque, inAngularVelocity); - if (response is ResponseSuccess) { - PreviousState.InAngularVelocity = inAngularVelocity; - Disengaged = false; - } return response; } @@ -154,7 +151,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity) { var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio; - var inTorque = ModelData.Gears[gear].LossMap.GetInTorque(inAngularVelocity, outTorque); + var torqueLoss = ModelData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); + var inTorque = outTorque / ModelData.Gears[gear].Ratio + torqueLoss; if (!inAngularVelocity.IsEqual(0)) { var alpha = (ModelData.Inertia.IsEqual(0)) @@ -302,8 +300,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; - var inTorque = ModelData.Gears[Gear].LossMap.GetInTorque(avgOutAngularVelocity * ModelData.Gears[Gear].Ratio, - outTorque); + var torqueLoss = ModelData.Gears[Gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque); + var inTorque = outTorque / ModelData.Gears[Gear].Ratio + torqueLoss; + var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio; if (dryRun) { diff --git a/VectoCore/Models/SimulationComponent/Impl/ManualGearbox.cs b/VectoCore/Models/SimulationComponent/Impl/ManualGearbox.cs index 9ea05e176f9d77c8ab6b450ae28b03615283df94..d0197c03eaae1b68b6dc9a7e8575b94ab67032fe 100644 --- a/VectoCore/Models/SimulationComponent/Impl/ManualGearbox.cs +++ b/VectoCore/Models/SimulationComponent/Impl/ManualGearbox.cs @@ -33,6 +33,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public class ManualGearbox : VectoSimulationComponent, IGearbox, ITnOutPort, ITnInPort, IClutchInfo { private readonly GearboxData _data; + private PerSecond PreviousOutAngularSpeed { get; set; } private ITnOutPort NextComponent { get; set; } private PerSecond PreviousInAngularSpeed { get; set; } private Watt PowerLossInertia { get; set; } @@ -81,15 +82,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var inAngularVelocity = outAngularVelocity * _data.Gears[Gear].Ratio; - var inTorque = _data.Gears[Gear].LossMap.GetInTorque(inAngularVelocity, outTorque); + var inTorque = outTorque / _data.Gears[Gear].Ratio; + var torqueLoss = _data.Gears[Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); + inTorque += torqueLoss; var torqueLossInertia = outAngularVelocity.IsEqual(0) ? 0.SI<NewtonMeter>() - : Formulas.InertiaPower(inAngularVelocity, PreviousInAngularSpeed, _data.Inertia, dt) / inAngularVelocity; + : Formulas.InertiaPower(outAngularVelocity, PreviousOutAngularSpeed, _data.Inertia, dt) / inAngularVelocity; inTorque += torqueLossInertia; var response = NextComponent.Initialize(inTorque, inAngularVelocity); + PreviousOutAngularSpeed = outAngularVelocity; return response; } @@ -116,7 +120,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var inEngineSpeed = outAngularVelocity * _data.Gears[Gear].Ratio; - var inTorque = _data.Gears[Gear].LossMap.GetInTorque(inEngineSpeed, outTorque); + var torqueLoss = _data.Gears[Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); + var inTorque = outTorque / _data.Gears[Gear].Ratio + torqueLoss; PowerLoss = inTorque * inEngineSpeed - outTorque * outAngularVelocity; diff --git a/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs b/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs index 9a6ec8b0ccd4435684fc122f2d616a709ebad38b..f54a4c5db18553619c3e3c927c26613f6d70a6c6 100644 --- a/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs +++ b/VectoCoreTest/Models/SimulationComponentData/GearboxDataTest.cs @@ -79,12 +79,13 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var torqueToWheels = Formulas.PowerToTorque(PvD, SpeedToAngularSpeed(speed, rdyn)); var torqueFromEngine = 0.SI<NewtonMeter>(); - var angSpeed = SpeedToAngularSpeed(speed, rdyn) * axleData.AxleGear.Ratio; + var angSpeed = SpeedToAngularSpeed(speed, rdyn); if (TestContext.DataRow["Gear"].ToString() == "A") { - torqueFromEngine = axleData.AxleGear.LossMap.GetInTorque(angSpeed, torqueToWheels); + torqueFromEngine = torqueToWheels / axleData.AxleGear.Ratio; + torqueFromEngine += axleData.AxleGear.LossMap.GetTorqueLoss(angSpeed, torqueToWheels); } - var powerEngine = Formulas.TorqueToPower(torqueFromEngine, angSpeed); + var powerEngine = Formulas.TorqueToPower(torqueFromEngine, angSpeed * axleData.AxleGear.Ratio); var loss = powerEngine - PvD; Assert.AreEqual(double.Parse(TestContext.DataRow["GbxPowerLoss"].ToString(), CultureInfo.InvariantCulture), @@ -108,33 +109,33 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var map = TransmissionLossMap.Create(data, 1.0, "1"); // test inside the triangles - AssertHelper.AreRelativeEqual(35, map.GetInTorque(25.RPMtoRad(), 25.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(60, map.GetInTorque(75.RPMtoRad(), 50.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(25.RPMtoRad(), 25.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(75.RPMtoRad(), 50.SI<NewtonMeter>())); // test interpolation on edges - AssertHelper.AreRelativeEqual(5, map.GetInTorque(50.RPMtoRad(), -5.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(55, map.GetInTorque(0.RPMtoRad(), 45.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(50, map.GetInTorque(50.RPMtoRad(), 40.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(85, map.GetInTorque(50.RPMtoRad(), 75.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(35, map.GetInTorque(100.RPMtoRad(), 25.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(50.RPMtoRad(), -5.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(0.RPMtoRad(), 45.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(50.RPMtoRad(), 40.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(50.RPMtoRad(), 75.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(100.RPMtoRad(), 25.SI<NewtonMeter>())); // test interpolation on corner points - AssertHelper.AreRelativeEqual(10, map.GetInTorque(0.RPMtoRad(), 0.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(100, map.GetInTorque(0.RPMtoRad(), 90.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(0, map.GetInTorque(100.RPMtoRad(), -10.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(70, map.GetInTorque(100.RPMtoRad(), 60.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(0.RPMtoRad(), 0.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(0.RPMtoRad(), 90.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(100.RPMtoRad(), -10.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(100.RPMtoRad(), 60.SI<NewtonMeter>())); // test outside the corners - AssertHelper.AreRelativeEqual(-10, map.GetInTorque(-20.RPMtoRad(), -20.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(130, map.GetInTorque(-20.RPMtoRad(), 120.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(-10, map.GetInTorque(120.RPMtoRad(), -20.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(130, map.GetInTorque(120.RPMtoRad(), 120.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(-20.RPMtoRad(), -20.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(-20.RPMtoRad(), 120.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(120.RPMtoRad(), -20.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(120.RPMtoRad(), 120.SI<NewtonMeter>())); // test outside the edges - AssertHelper.AreRelativeEqual(60, map.GetInTorque(-20.RPMtoRad(), 50.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(130, map.GetInTorque(50.RPMtoRad(), 120.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(-10, map.GetInTorque(50.RPMtoRad(), -20.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(60, map.GetInTorque(120.RPMtoRad(), 50.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(-20.RPMtoRad(), 50.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(50.RPMtoRad(), 120.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(50.RPMtoRad(), -20.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(120.RPMtoRad(), 50.SI<NewtonMeter>())); } [TestMethod] @@ -197,33 +198,33 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var map = TransmissionLossMap.Create(data, 1.0, "1"); // test inside the triangles - AssertHelper.AreRelativeEqual(30, map.GetInTorque(25.RPMtoRad(), 25.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(67.5, map.GetInTorque(75.RPMtoRad(), 50.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(5, map.GetTorqueLoss(25.RPMtoRad(), 25.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(17.5, map.GetTorqueLoss(75.RPMtoRad(), 50.SI<NewtonMeter>())); // test interpolation on edges - AssertHelper.AreRelativeEqual(0, map.GetInTorque(50.RPMtoRad(), -5.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(49.5, map.GetInTorque(0.RPMtoRad(), 45.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(49, map.GetInTorque(50.RPMtoRad(), 40.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(92.5, map.GetInTorque(50.RPMtoRad(), 75.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(42.5, map.GetInTorque(100.RPMtoRad(), 25.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(5, map.GetTorqueLoss(50.RPMtoRad(), -5.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(4.5, map.GetTorqueLoss(0.RPMtoRad(), 45.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(9, map.GetTorqueLoss(50.RPMtoRad(), 40.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(17.5, map.GetTorqueLoss(50.RPMtoRad(), 75.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(17.5, map.GetTorqueLoss(100.RPMtoRad(), 25.SI<NewtonMeter>())); // test interpolation on corner points - AssertHelper.AreRelativeEqual(0, map.GetInTorque(0.RPMtoRad(), 0.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(99, map.GetInTorque(0.RPMtoRad(), 90.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(0, map.GetInTorque(100.RPMtoRad(), -10.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(88, map.GetInTorque(100.RPMtoRad(), 60.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(0, map.GetTorqueLoss(0.RPMtoRad(), 0.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(9, map.GetTorqueLoss(0.RPMtoRad(), 90.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(100.RPMtoRad(), -10.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(28, map.GetTorqueLoss(100.RPMtoRad(), 60.SI<NewtonMeter>())); // test outside the corners - AssertHelper.AreRelativeEqual(-20, map.GetInTorque(-20.RPMtoRad(), -20.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(130, map.GetInTorque(-20.RPMtoRad(), 120.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(-10, map.GetInTorque(120.RPMtoRad(), -20.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(160, map.GetInTorque(120.RPMtoRad(), 120.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(0, map.GetTorqueLoss(-20.RPMtoRad(), -20.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(-20.RPMtoRad(), 120.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(120.RPMtoRad(), -20.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(40, map.GetTorqueLoss(120.RPMtoRad(), 120.SI<NewtonMeter>())); // test outside the edges - AssertHelper.AreRelativeEqual(55, map.GetInTorque(-20.RPMtoRad(), 50.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(145, map.GetInTorque(50.RPMtoRad(), 120.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(-15, map.GetInTorque(50.RPMtoRad(), -20.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(75, map.GetInTorque(120.RPMtoRad(), 50.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(5, map.GetTorqueLoss(-20.RPMtoRad(), 50.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(25, map.GetTorqueLoss(50.RPMtoRad(), 120.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(5, map.GetTorqueLoss(50.RPMtoRad(), -20.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(25, map.GetTorqueLoss(120.RPMtoRad(), 50.SI<NewtonMeter>())); } [TestMethod] @@ -252,10 +253,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData AssertHelper.AreRelativeEqual(7.5, map.GetOutTorque(100.RPMtoRad(), 25.SI<NewtonMeter>())); // test interpolation on corner points - AssertHelper.AreRelativeEqual(0, map.GetInTorque(0.RPMtoRad(), 0.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(100, map.GetInTorque(0.RPMtoRad(), 90.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(0, map.GetInTorque(100.RPMtoRad(), -10.SI<NewtonMeter>())); - AssertHelper.AreRelativeEqual(100, map.GetInTorque(100.RPMtoRad(), 60.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(0, map.GetTorqueLoss(0.RPMtoRad(), 0.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(0.RPMtoRad(), 90.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(10, map.GetTorqueLoss(100.RPMtoRad(), -10.SI<NewtonMeter>())); + AssertHelper.AreRelativeEqual(40, map.GetTorqueLoss(100.RPMtoRad(), 60.SI<NewtonMeter>())); // test outside the corners AssertHelper.AreRelativeEqual(-20, map.GetOutTorque(-20.RPMtoRad(), -20.SI<NewtonMeter>(), true));