diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs index b9fdc5afca8faf2d981a98589fcf02c4477b5608..e8992d376f6d3baca3aabee0a1d3a3221d1ee2df 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxShiftLossesTest.cs @@ -29,6 +29,7 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System; using System.Globalization; using NUnit.Framework; using TUGraz.VectoCommon.Models; @@ -70,20 +71,128 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent } [Test, - TestCase(200, 2u, 562, 620, 19.5023), - TestCase(400, 2u, 562, 620, 39.0046), - TestCase(600, 2u, 562, 620, 58.5069), - TestCase(800, 2u, 562, 620, 78.0092), - TestCase(200, 2u, 562, 600, 19.7908), - TestCase(400, 2u, 562, 600, 39.5816), - TestCase(600, 2u, 562, 600, 59.3723), - TestCase(800, 2u, 562, 600, 79.1632), - TestCase(400, 3u, 500, 490, 30.7900), - TestCase(400, 3u, 550, 490, 32.4643), - TestCase(600, 3u, 550, 490, 48.6965), + TestCase(200, 2u, 562, 620, 19.5023, double.NaN), + TestCase(400, 2u, 562, 620, 39.0046, 3183.0086), + TestCase(600, 2u, 562, 620, 58.5069, double.NaN), + TestCase(800, 2u, 562, 620, 78.0092, double.NaN), + TestCase(200, 2u, 562, 600, 19.7908, double.NaN), + TestCase(400, 2u, 562, 600, 39.5816, double.NaN), + TestCase(600, 2u, 562, 600, 59.3723, 4774.5128), + TestCase(800, 2u, 562, 600, 79.1632, double.NaN), + TestCase(400, 3u, 500, 490, 30.7900, double.NaN), + TestCase(400, 3u, 550, 490, 32.4643, 2328.0855), + TestCase(600, 3u, 550, 490, 48.6965, double.NaN), ] public void TestShiftLossComputation(double torqueDemand, uint gear, double preShiftRpm, - double postShiftRpm, double expectedShiftLoss) + double postShiftRpm, double expectedShiftLoss, double expectedShiftLossEnergy) + { + AxleGear axleGear; + ATGearbox gbx; + CombustionEngine engine; + var cycleDataStr = "0, 0, 0, 2\n100, 20, 0, 0\n1000, 50, 0, 0"; + var container = CreateVehicle(cycleDataStr, preShiftRpm, out axleGear, out gbx, out engine); + + gbx.Gear = gear; + + var absTime = 20.SI<Second>(); + var dt = 0.5.SI<Second>(); + var response = gbx.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); + axleGear.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); + + + Assert.IsInstanceOf<ResponseSuccess>(response); + container.CommitSimulationStep(absTime, dt); + absTime += dt; + + response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); + Assert.IsInstanceOf<ResponseFailTimeInterval>(response); + + dt = ((ResponseFailTimeInterval)response).DeltaT; + response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); + + Assert.IsInstanceOf<ResponseSuccess>(response); + Assert.AreEqual(expectedShiftLoss, gbx.CurrentState.PowershiftLoss.Value(), 1e-3); + Assert.AreEqual(gear + (postShiftRpm > preShiftRpm ? 1 : -1), gbx.Gear); + + if (!double.IsNaN(expectedShiftLossEnergy)) { + var modData = new MockModalDataContainer(); + gbx.CommitSimulationStep(modData); + var shiftLossE = (Watt)modData[ModalResultField.P_gbx_shift_loss] * dt; + Assert.AreEqual(expectedShiftLossEnergy, shiftLossE.Value(), 1e-3); + } + } + + [Test, + //TestCase(200, 2u, 562, 620, 19.5023), + TestCase(400, 2u, 562, 620, 39.0046, 3183.0086), + //TestCase(600, 2u, 562, 620, 58.5069), + //TestCase(800, 2u, 562, 620, 78.0092), + //TestCase(200, 2u, 562, 600, 19.7908), + //TestCase(400, 2u, 562, 600, 39.5816), + TestCase(600, 2u, 562, 600, 59.3723, 4774.5128), + //TestCase(800, 2u, 562, 600, 79.1632), + //TestCase(400, 3u, 500, 490, 30.7900), + TestCase(400, 3u, 550, 490, 32.4643, 2328.0855), + //TestCase(600, 3u, 550, 490, 48.6965), + ] + public void TestSplittingShiftLossesTwoIntervals(double torqueDemand, uint gear, double preShiftRpm, + double postShiftRpm, double expectedShiftLoss, double expectedShiftLossEnergy) + { + AxleGear axleGear; + ATGearbox gbx; + CombustionEngine engine; + var cycleDataStr = "0, 0, 0, 2\n100, 20, 0, 0\n1000, 50, 0, 0"; + var container = CreateVehicle(cycleDataStr, preShiftRpm, out axleGear, out gbx, out engine); + var modData = new MockModalDataContainer(); + + gbx.Gear = gear; + + var absTime = 20.SI<Second>(); + var dt = 0.5.SI<Second>(); + var response = gbx.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); + axleGear.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); + + + Assert.IsInstanceOf<ResponseSuccess>(response); + container.CommitSimulationStep(absTime, dt); + absTime += dt; + + response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); + Assert.IsInstanceOf<ResponseFailTimeInterval>(response); + + var splitFactor = 0.75; + var shiftTime = ((ResponseFailTimeInterval)response).DeltaT; + dt = shiftTime * splitFactor; + response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); + + Assert.IsInstanceOf<ResponseSuccess>(response); + Assert.AreEqual(expectedShiftLoss, gbx.CurrentState.PowershiftLoss.Value(), 1e-3); + Assert.AreEqual(gear + (postShiftRpm > preShiftRpm ? 1 : -1), gbx.Gear); + + gbx.CommitSimulationStep(modData); + engine.CommitSimulationStep(modData); + var shiftLoss1 = (Watt)modData[ModalResultField.P_gbx_shift_loss] * dt; + Assert.AreEqual(expectedShiftLossEnergy * splitFactor, shiftLoss1.Value(), 1e-3); + axleGear.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); + + absTime += dt; + dt = 0.5.SI<Second>(); + + response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); + + Assert.IsInstanceOf<ResponseSuccess>(response); + gbx.CommitSimulationStep(modData); + engine.CommitSimulationStep(modData); + var shiftLoss2 = (Watt)modData[ModalResultField.P_gbx_shift_loss] * dt; + Console.WriteLine("expected shiftloss energy: {0}, sum of shift loss energy: {1} ({2} + {3})", expectedShiftLossEnergy, shiftLoss1 + shiftLoss2, shiftLoss1, shiftLoss2); + Assert.AreEqual(expectedShiftLossEnergy * (1 - splitFactor), shiftLoss2.Value(), 1e-3); + + Assert.AreEqual(expectedShiftLossEnergy, (shiftLoss1 + shiftLoss2).Value(), 1e-3); + } + + + + private static VehicleContainer CreateVehicle(string cycleDataStr, double preShiftRpm, out AxleGear axleGear, out ATGearbox gbx, out CombustionEngine engine) { var engineInertia = 5.SI<KilogramSquareMeter>(); @@ -92,11 +201,11 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var container = new VehicleContainer(ExecutionMode.Engineering); gearboxData.PowershiftShiftTime = 0.8.SI<Second>(); - var cycleDataStr = "0, 0, 0, 2\n100, 20, 0, 0\n1000, 50, 0, 0"; + var cycleData = SimpleDrivingCycles.CreateCycleData(cycleDataStr); var cycle = new MockDrivingCycle(container, cycleData); - var axleGear = new AxleGear(container, CreateAxleGearData(GearboxType.ATSerial)); + axleGear = new AxleGear(container, CreateAxleGearData(GearboxType.ATSerial)); axleGear.Connect(new MockComponent()); var wheels = new Wheels(container, 0.5.SI<Meter>(), 9.5.SI<KilogramSquareMeter>()); @@ -106,41 +215,21 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var driver = new MockDriver(container); vehicle.MyVehicleSpeed = 10.KMPHtoMeterPerSecond(); driver.DriverBehavior = DrivingBehavior.Driving; - var engine = new CombustionEngine(container, + engine = new CombustionEngine( + container, MockSimulationDataFactory.CreateEngineDataFromFile(ATPowerTrain.EngineFile, gearboxData.Gears.Count)); container.Engine = engine; var runData = new VectoRunData() { GearboxData = gearboxData, EngineData = new CombustionEngineData() { Inertia = 5.SI<KilogramSquareMeter>() } }; - var gbx = new ATGearbox(container, new ATShiftStrategy(gearboxData, container), runData); + gbx = new ATGearbox(container, new ATShiftStrategy(gearboxData, container), runData); gbx.Connect(engine); gbx.IdleController = new MockIdleController(); var init = gbx.Initialize(0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); axleGear.Initialize(0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); - - gbx.Gear = gear; - - var absTime = 20.SI<Second>(); - var dt = 0.5.SI<Second>(); - var response = gbx.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); - axleGear.Request(absTime, dt, 0.SI<NewtonMeter>(), preShiftRpm.RPMtoRad()); - - - Assert.IsInstanceOf<ResponseSuccess>(response); - container.CommitSimulationStep(absTime, dt); - absTime += dt; - - response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); - Assert.IsInstanceOf<ResponseFailTimeInterval>(response); - - dt = ((ResponseFailTimeInterval)response).DeltaT; - response = gbx.Request(absTime, dt, torqueDemand.SI<NewtonMeter>(), postShiftRpm.RPMtoRad()); - - Assert.IsInstanceOf<ResponseSuccess>(response); - Assert.AreEqual(expectedShiftLoss, gbx.CurrentState.PowershiftLoss.Value(), 1e-3); - Assert.AreEqual(gear + (postShiftRpm > preShiftRpm ? 1 : -1), gbx.Gear); + return container; } } } \ No newline at end of file