diff --git a/VECTO.sln b/VECTO.sln index 698a2d252080f3d6aeba22ad86baada06fe04562..5f00660e5d09ac468df68b64be6517f324be2e56 100644 --- a/VECTO.sln +++ b/VECTO.sln @@ -682,6 +682,48 @@ Global {33F9848E-9257-4BE2-915F-68E748AEB204}.ReleaseTUG|Any CPU.Build.0 = Release|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.ReleaseTUG|x64.ActiveCfg = Release|Any CPU {33F9848E-9257-4BE2-915F-68E748AEB204}.ReleaseTUG|x86.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|Any CPU.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|Any CPU.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x64.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x64.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x86.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceStats|x86.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|Any CPU.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|Any CPU.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x64.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x64.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x86.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug PerformanceTrace|x86.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x64.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x64.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x86.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Debug|x86.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|Any CPU.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|Any CPU.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x64.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x64.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x86.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.DebugTUG|x86.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|Any CPU.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x64.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x64.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x86.ActiveCfg = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Deploy|x86.Build.0 = Debug|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|Any CPU.Build.0 = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x64.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x64.Build.0 = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x86.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.Release|x86.Build.0 = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|Any CPU.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|Any CPU.Build.0 = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x64.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x64.Build.0 = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x86.ActiveCfg = Release|Any CPU + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA}.ReleaseTUG|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -705,5 +747,6 @@ Global {7C364099-9B85-473A-8A42-BBEBE4798FF5} = {CC93EA68-F3FE-4BCB-9292-1101F94A4D09} {B673E12F-D323-4C4C-8805-9915B2C72D3D} = {73A5BF70-6168-456F-95E5-A1402BFA488C} {760C1C5B-A767-463E-BA85-F0BCFC23A550} = {73A5BF70-6168-456F-95E5-A1402BFA488C} + {EF99431D-4227-44C3-B2BD-DE8AE3E672CA} = {CC93EA68-F3FE-4BCB-9292-1101F94A4D09} EndGlobalSection EndGlobal diff --git a/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj b/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj index 625ae6cc108fd7ba0f2c78a68f722c14d1bcf530..427e091eff69251b6acc3adcad1ce953ad357408 100644 --- a/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj +++ b/VECTOAux/VectoAuxiliariesTests/VectoAuxiliariesTests.vbproj @@ -62,7 +62,6 @@ <OptionInfer>On</OptionInfer> </PropertyGroup> <ItemGroup> - <Reference Include="DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> <Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" /> <Reference Include="Moq"> <HintPath>..\..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll</HintPath> diff --git a/VectoCommon/VectoHashingTest/VectoHashTest.cs b/VectoCommon/VectoHashingTest/VectoHashTest.cs index aa08450c89b11cabec12b99d3a8ddcabd61b4f1a..67dc3fc197486c17a8207510d7e0e3789fe367a5 100644 --- a/VectoCommon/VectoHashingTest/VectoHashTest.cs +++ b/VectoCommon/VectoHashingTest/VectoHashTest.cs @@ -34,8 +34,6 @@ using System.IO; using System.Linq; using System.Text; using System.Xml; -using System.Xml.Linq; -using System.Xml.Schema; using System.Xml.XPath; using NUnit.Framework; using TUGraz.VectoCommon.Hashing; @@ -332,13 +330,13 @@ namespace VectoHashingTest var input = new XmlDocument(); input.Load(file); var dateNode = input.SelectSingleNode("//*[local-name()='Date']"); - var date = XmlConvert.ToDateTime(dateNode.FirstChild.Value); + var date = XmlConvert.ToDateTime(dateNode.FirstChild.Value, XmlDateTimeSerializationMode.Utc); var h = VectoHash.Load(input); var r = h.AddHash(); var newDateNode = r.XPathSelectElement("//*[local-name()='Date']"); - var newDate = XmlConvert.ToDateTime(newDateNode.Value); + var newDate = XmlConvert.ToDateTime(newDateNode.Value, XmlDateTimeSerializationMode.Utc); var now = DateTime.Now; diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs index e9719ca52f0282002afac1a50256dfb0ef8ed7a9..8e5812da52eb2e227e37f8450c1466b346f07523 100644 --- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs +++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs @@ -99,7 +99,10 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl /// <summary> /// Response when the Speed Limit was exceeded. /// </summary> - public class ResponseSpeedLimitExceeded : AbstractResponse {} + public class ResponseSpeedLimitExceeded : AbstractResponse + { + public ResponseSpeedLimitExceeded() { } + } /// <summary> /// Response when the request should have another time interval. diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs index 1ae06d4292336e3d30adcad0f5106f83446e375b..8a64b72387c809f0c0e1120aba1e022e85601d8a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs @@ -262,7 +262,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox var mpEdge = Edge.Create(new Point(segment.Item1.SpeedRatio, segment.Item1.Torque.Value()), new Point(segment.Item2.SpeedRatio, segment.Item2.Torque.Value())); - + // Torque Converter: M_P1000 = k * n_out / n_in + d // T_out = M_P1000 * (n_in / 1000rpm)^2 = (k * n_out / n_in + d) * (n_in / c)^2 // P_eng_out = P_eng_inertia + P_TC_in_avg @@ -277,7 +277,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox previousPowerTC / 2; var sol = VectoMath.CubicEquationSolver(a.Value(), b.Value(), c, d.Value()); //============================================================================ - + /* // Torque Converter: M_P1000 = k * n_out / n_in + d @@ -287,16 +287,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox // P_TC_in_avg = n_in_2 (T_in_1 * n_in_1 + T_in_2 * n_in_2) / (n_in_1 + n_in_2) // (index _1: beginning of simulation interval, index _2: end of simulation interval) // => solve for n_in + */ + //var a = 2 * mpEdge.OffsetXY.SI<NewtonMeter>() * dt / (mpNorm * mpNorm); + //var b = inertia + 2 * dt * nextOutputSpeed * mpEdge.SlopeXY.SI<NewtonMeter>() / (mpNorm * mpNorm); + //var c = prevInputSpeed * inertia; + //var d = 2 * dt * previousPowerTC - inertia * prevInputSpeed * prevInputSpeed - 2 * dt * enginePower; + //var e = - inertia * prevInputSpeed * prevInputSpeed * prevInputSpeed - 2 * dt * prevInputSpeed * enginePower; - var a = 2 * mpEdge.OffsetXY.SI<NewtonMeter>() * dt / (mpNorm * mpNorm); - var b = inertia + 2 * dt * nextOutputSpeed * mpEdge.SlopeXY.SI<NewtonMeter>() / (mpNorm * mpNorm); - var c = prevInputSpeed * inertia; - var d = 2 * dt * previousPowerTC - inertia * prevInputSpeed * prevInputSpeed - 2 * dt * enginePower; - var e = - inertia * prevInputSpeed * prevInputSpeed * prevInputSpeed - 2 * dt * prevInputSpeed * enginePower; - - var sol = VectoMath.Polynom4Solver(a.Value(), b.Value(), c.Value(), d.Value(), e.Value()); + //var sol = VectoMath.Polynom4Solver(a.Value(), b.Value(), c.Value(), d.Value(), e.Value()); //============================================================================ - */ + // T_eng_o_2 + T_eng_I + T_aux - T_max) (n_in_1 + n_in_2) / 2 = 0 //var a = dt * mpEdge.OffsetXY.SI<NewtonMeter>() / (mpNorm * mpNorm); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index d38d385e4af9aebdf76f2cbe98fdbafa6a80ae19..e4bd52449eb26fa652920110b99b5894f22ff5cd 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -452,6 +452,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var second = first; first.Switch(). Case<ResponseUnderload>(r => { + if (DataBus.GearboxType.AutomaticTransmission() && !DataBus.ClutchClosed(absTime)) { + second = Driver.DrivingActionRoll(absTime, ds, velocity, gradient); + } if (DataBus.VehicleSpeed.IsGreater(0) && DriverStrategy.OverspeedAllowed(targetVelocity, prohibitOverspeed)) { second = Driver.DrivingActionCoast(absTime, ds, velocity, gradient); debug.Add(new { action = "first:(Underload & Overspeed)-> Coast", second }); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs index 932bf48a6c8a847bcb2fd070c3b768406686a2ec..f9ae4a14963bb5c3355563139bf1421d5ee189f0 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs @@ -98,7 +98,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { var operatingPoint = FindOperatingPoint(outTorque, outAngularVelocity); var avgEngineSpeed = (PreviousState.InAngularVelocity + operatingPoint.InAngularVelocity) / 2; - var avgPower = (PreviousState.InAngularVelocity * PreviousState.InTorque + + //var prevInSpeed = PreviousState.OperatingPoint?.InAngularVelocity ?? PreviousState.InAngularVelocity; + //var prevInTorque = PreviousState.OperatingPoint?.InTorque ?? PreviousState.InTorque; + var prevInSpeed = PreviousState.InAngularVelocity; + var prevInTorque = PreviousState.InTorque; + var avgPower = (prevInSpeed * prevInTorque + operatingPoint.InAngularVelocity * operatingPoint.InTorque) / 2; var inTorque = avgPower / avgEngineSpeed; @@ -127,7 +131,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl // check if shift is required var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio; - if (retVal is ResponseSuccess && + if (absTime > DataBus.LastShift && retVal is ResponseSuccess && ShiftStrategy.ShiftRequired(absTime, dt, outTorque * ratio, outAngularVelocity / ratio, inTorque, operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift)) { return new ResponseGearShift { Source = this }; @@ -164,10 +168,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var avgOutSpeedMin = (PreviousState.OutAngularVelocity + dryOperatingPointMin.OutAngularVelocity) / 2.0; var deltaMin = (outTorque - dryOperatingPointMin.OutTorque) * avgOutSpeedMin; + var inTorqueMax = + (PreviousState.InAngularVelocity * PreviousState.InTorque + + dryOperatingPointMax.InAngularVelocity * dryOperatingPointMax.InTorque) / + (PreviousState.InAngularVelocity + dryOperatingPointMax.InAngularVelocity); var inTorqueMin = (PreviousState.InAngularVelocity * PreviousState.InTorque + dryOperatingPointMin.InAngularVelocity * dryOperatingPointMin.InTorque) / (PreviousState.InAngularVelocity + dryOperatingPointMin.InAngularVelocity); + var engRespMax = (ResponseDryRun) + NextComponent.Request(absTime, dt, inTorqueMax, dryOperatingPointMax.InAngularVelocity, true); var engRespMin = (ResponseDryRun) NextComponent.Request(absTime, dt, inTorqueMin, dryOperatingPointMin.InAngularVelocity, true); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs index 6798202de47f56dcd9a61106275c3bbfd2c14386..9e07f8dee4d34437c704b1142107b1ab1aef695b 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/TorqueConverterDataTest.cs @@ -29,448 +29,570 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using NLog.Targets; -using NUnit.Framework; -using TUGraz.VectoCommon.Models; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Configuration; -using TUGraz.VectoCore.InputData.Reader.ComponentData; -using TUGraz.VectoCore.Tests.Utils; - -namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData -{ - [TestFixture] - public class TorqueConverterDataTest - { - [Test] - public void TestTorqueConverterDataDeclarationMode() - { - var tqInput = new[] { - "0.0,1.80,377.80 ", - "0.1,1.71,365.21 ", - "0.2,1.61,352.62 ", - "0.3,1.52,340.02 ", - "0.4,1.42,327.43 ", - "0.5,1.33,314.84 ", - "0.6,1.23,302.24 ", - "0.7,1.14,264.46 ", - "0.8,1.04,226.68 ", - "0.9,0.95,188.90 ", - "1.0,0.95,0.00 ", - "1.100,0.99,-40.34 ", - "1.222,0.98,-80.34 ", - "1.375,0.97,-136.11 ", - "1.571,0.96,-216.52 ", - "1.833,0.95,-335.19 ", - "2.200,0.94,-528.77 ", - "2.750,0.93,-883.40 ", - "4.400,0.92,-2462.17 ", - "11.000,0.91,-16540.98 ", - }; - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", - tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - // check input data - Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); - Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); - Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); - - Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9); - Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9); - Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9); - - // check appended data - - Assert.AreEqual(0.959, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9); - Assert.AreEqual(-2290, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9); - Assert.AreEqual(5, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9); - } - - [Test] - public void TestTorqueConverterExtendPowersplit() - { - var tqInput = new[] { - "0.0,1.80,377.80 ", - "0.1,1.71,365.21 ", - "0.2,1.61,352.62 ", - "0.3,1.52,340.02 ", - "0.4,1.42,327.43 ", - "0.5,1.33,314.84 ", - "0.6,1.23,302.24 ", - "0.7,1.14,264.46 ", - "0.8,1.04,226.68 ", - "0.9,0.95,188.90 ", - "1.0,0.95,0.00 ", - "1.100,0.99,-40.34 ", - "1.222,0.98,-80.34 ", - "1.375,0.97,-136.11 ", - "1.571,0.96,-216.52 ", - "1.833,0.95,-335.19 ", - "2.200,0.94,-528.77 ", - "2.750,0.93,-883.40 ", - "4.400,0.92,-2462.17 ", - "11.000,0.91,-16540.98 ", - }; - - var ratio = 0.75; - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", - tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, ratio, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - // check input data - Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); - Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); - Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); - - Assert.AreEqual(1.14, tqData.TorqueConverterEntries[7].TorqueRatio, 1e-9); - Assert.AreEqual(264.46, tqData.TorqueConverterEntries[7].Torque.Value(), 1e-9); - Assert.AreEqual(0.7, tqData.TorqueConverterEntries[7].SpeedRatio, 1e-9); - - // check appended data - - Assert.AreEqual(0.959 / ratio, tqData.TorqueConverterEntries[18].TorqueRatio, 1e-9); - Assert.AreEqual(-2290, tqData.TorqueConverterEntries[18].Torque.Value(), 1e-9); - Assert.AreEqual(5 * ratio, tqData.TorqueConverterEntries[18].SpeedRatio, 1e-9); - } - - [Test] - public void TestTorqueConverterDataEngneeringMode_Append() - { - var tqInput = new[] { - "0.0,1.80,377.80 ", - "0.1,1.71,365.21 ", - "0.2,1.61,352.62 ", - "0.3,1.52,340.02 ", - "0.4,1.42,327.43 ", - "0.5,1.33,314.84 ", - "0.6,1.23,302.24 ", - "0.7,1.14,264.46 ", - "0.8,1.04,226.68 ", - "0.9,0.95,188.90 ", - }; - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", - tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - // check input data - Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); - Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); - Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); - - Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9); - Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9); - Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9); - - // check appended data - Assert.AreEqual(0.999, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9); - Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9); - Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9); - - Assert.AreEqual(0.959, tqData.TorqueConverterEntries[50].TorqueRatio, 1e-9); - Assert.AreEqual(-2290, tqData.TorqueConverterEntries[50].Torque.Value(), 1e-9); - Assert.AreEqual(5, tqData.TorqueConverterEntries[50].SpeedRatio, 1e-9); - } - - [Test] - public void TestTorqueConverterDataEngineeringMode_Unmodified() - { - var tqInput = new[] { - "0.0,1.80,377.80 ", - "0.1,1.71,365.21 ", - "0.2,1.61,352.62 ", - "0.3,1.52,340.02 ", - "0.4,1.42,327.43 ", - "0.5,1.33,314.84 ", - "0.6,1.23,302.24 ", - "0.7,1.14,264.46 ", - "0.8,1.04,226.68 ", - "0.9,0.95,188.90 ", - "1.0,0.95,0.00 ", - "1.100,0.99,-40.34 ", - "1.222,0.98,-80.34 ", - "1.375,0.97,-136.11 ", - "1.571,0.96,-216.52 ", - "1.833,0.95,-335.19 ", - "2.200,0.94,-528.77 ", - "2.750,0.93,-883.40 ", - "4.400,0.92,-2462.17 ", - "11.000,0.91,-16540.98 ", - }; - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", - tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - // check input data - Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); - Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); - Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); - - Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9); - Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9); - Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9); - - Assert.AreEqual(0.95, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9); - Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9); - Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9); - - Assert.AreEqual(0.91, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9); - Assert.AreEqual(-16540.98, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9); - Assert.AreEqual(11, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9); - } - - [Test, - TestCase(30, 10, 227.8707, 1780.6630), - TestCase(40, 10, 197.9536, 1340.4737), - TestCase(50, 10, 177.6759, 1076.9007), - TestCase(60, 10, 162.8219, 901.5900), - TestCase(70, 10, 151.3747, 776.6864), - TestCase(70, 30, 259.9515, 2306.1578), - TestCase(90, 10, 134.7344, 610.8267), - TestCase(90, 30, 230.4896, 1805.2978), - TestCase(170, 30, 172.2875, 987.4020), - TestCase(170, 50, 220.2397, 1626.0613), - TestCase(190, 30, 164.3260, 892.7507), - TestCase(190, 50, 209.6016, 1465.6611), - TestCase(190, 70, 246.4829, 2036.7399), - TestCase(530.517, 1.930, 59.0758, 35.8217), - ] - public void TestTorqueConverterOperatingPoint(double nOut, double Pout, double nInExpected, double tqInExpected) - { - var tqLimit = 1600; - //Assert.IsTrue(nInExpected < tqLimit); - var tqInput = new[] { - "0.0,1.80,377.80", - "0.1,1.71,365.21", - "0.2,1.61,352.62", - "0.3,1.52,340.02", - "0.4,1.42,327.43", - "0.5,1.33,314.84", - "0.6,1.23,302.24", - "0.7,1.14,264.46", - "0.8,1.04,226.68", - "0.9,0.95,188.90", - "1.0,0.95,0.00", - }; - - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", - tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - var outAngularSpeed = nOut.RPMtoRad(); - var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed; - var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>()); - Assert.AreEqual(1, resultList.Count); - var result = resultList[0]; - - Assert.AreEqual(outAngularSpeed.Value(), result.OutAngularVelocity.Value(), 1e-3); - Assert.AreEqual(outTorque.Value(), result.OutTorque.Value(), 1e-3); - - //Debug.WriteLine("n_in: {0}, tq_in: {1}", result.InAngularVelocity.AsRPM, result.InTorque.Value()); - //Assert.IsTrue(result.InAngularVelocity.Value() < 1600.RPMtoRad().Value()); - Assert.AreEqual(nInExpected, result.InAngularVelocity.Value(), 1e-3); - Assert.AreEqual(tqInExpected, result.InTorque.Value(), 1e-3); - } - - [Test, - TestCase(898, 463)] - public void TestTorqueConverterOperatingPointForward(double nIn, double tqIn) - { - var tqLimit = 1600; - - var tqInput = new[] { - "0.0, 4.5, 700", - "0.1, 3.5, 640 ", - "0.2, 2.7, 560 ", - "0.3, 2.2, 460 ", - "0.4, 1.6, 350 ", - "0.5, 1.2, 250 ", - "0.6, 0.9, 160 ", - "0.74, 0.9, 1", - }; - - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", - tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - var operatingPoint = tqData.FindOperatingPointForward(tqIn.SI<NewtonMeter>(), nIn.RPMtoRad(), null); - - Assert.AreEqual(operatingPoint.InTorque.Value(), tqIn, 1e-6); - Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), nIn.RPMtoRad().Value(), 1e-6); - - var resultList = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity, - 0.SI<PerSecond>()); - Assert.AreEqual(1, resultList.Count); - var reverseOP = resultList[0]; - - Assert.AreEqual(operatingPoint.InTorque.Value(), reverseOP.InTorque.Value(), 1e-6); - Assert.AreEqual(operatingPoint.OutTorque.Value(), reverseOP.OutTorque.Value(), 1e-6); - Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), reverseOP.InAngularVelocity.Value(), 1e-6); - Assert.AreEqual(operatingPoint.OutAngularVelocity.Value(), reverseOP.OutAngularVelocity.Value(), 1e-6); - } - - [Test] - public void TestTorqueConverterComparisonV2() - { - var tqLimit = 1600; - - var tqInput = new[] { - "0.0,1.80,377.80", - "0.1,1.71,365.21", - "0.2,1.61,352.62", - "0.3,1.52,340.02", - "0.4,1.42,327.43", - "0.5,1.33,314.84", - "0.6,1.23,302.24", - "0.7,1.14,264.46", - "0.8,1.04,226.68", - "0.9,0.95,188.90", - "1.0,0.95,0.00", - }; - var testData = new List<Tuple<double, double>>() { - Tuple.Create(139.4087374, 72.74847642), - Tuple.Create(2275.286998, 453.9413043), - Tuple.Create(1507.256216, 1012.44118), - Tuple.Create(26.58522419, 29.25312925), - Tuple.Create(1752.83589, 328.6386397), - }; - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", - tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - foreach (var entry in testData) { - var torqueTCOut = entry.Item1.SI<NewtonMeter>(); - var angularSpeedOut = entry.Item2.RPMtoRad(); - var result = tqData.FindOperatingPoint(torqueTCOut, angularSpeedOut, 0.SI<PerSecond>()).First(); - //Debug.WriteLine("n_out: {0}, tq_out: {1}, n_in: {2}, Tq_in: {3}", angularSpeedOut.Value() / Constants.RPMToRad, - // torqueTCOut.Value(), result.InAngularVelocity.Value() / Constants.RPMToRad, result.InTorque.Value()); - } - } - - [Test, - TestCase(10, 110), - TestCase(20, 130), - TestCase(50, 90), - TestCase(50, 190), - TestCase(60, 150), - TestCase(70, 70), - TestCase(70, 90), - TestCase(70, 190), - TestCase(80, 50), - TestCase(80, 130), - TestCase(90, 70), - TestCase(100, 150), - TestCase(130, 70), - TestCase(150, 80), - TestCase(170, 80), - ] - public void TestTorqueConverterInvalidOperatingPoint(double nOut, double Pout) - { - var tqLimit = 1600.RPMtoRad(); - - var tqInput = new[] { - "0,3.935741,563.6598 ", - "0.1,3.296827,534.1364", - "0.2,2.701476,504.6129", - "0.3,2.265852,472.1372", - "0.4,1.931875,421.9474", - "0.5,1.554335,354.0435", - "0.6,1.249399,268.4255", - "0.7,1.075149,114.9037", - }; - - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", - tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - var outAngularSpeed = nOut.RPMtoRad(); - var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed; - var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>()); - Assert.AreEqual(1, resultList.Count); - var result = resultList[0]; - - Assert.IsTrue(result.InAngularVelocity.Value() > tqLimit.Value()); - } - - [TestCase()] - public void TestForwardBackward() - { - var tqLimit = 1600.RPMtoRad(); - - var tqInput = new[] { - "0,4.6,708 ", - "0.1,3.7,641 ", - "0.2,2.9,560 ", - "0.3,2.4,465 ", - "0.4,1.8,356 ", - "0.5,1.4,251 ", - "0.6,0.9,166 ", - "0.735,0.9,1 ", - "0.738,1.361,0 ", - "0.808,1.351,-40 ", - "0.898,1.349,-80 ", - "1.01,1.338,-136 ", - "1.154,1.327,-217 ", - "1.347,1.316,-335 ", - "1.616,1.305,-529 ", - "3 ,1.294,-729 ", - }; - - var tqInput_1 = new[] { - "0.0,1.80,377.80 ", - "0.1,1.71,365.21 ", - "0.2,1.61,352.62 ", - "0.3,1.52,340.02 ", - "0.4,1.42,327.43 ", - "0.5,1.33,314.84 ", - "0.6,1.23,302.24 ", - "0.7,1.14,264.46 ", - "0.8,1.04,226.68 ", - "0.9,0.95,188.90 ", - "1.0,0.95,0.00 ", - "1.100,0.99,-40.34 ", - "1.222,0.98,-80.34 ", - "1.375,0.97,-136.11 ", - "1.571,0.96,-216.52 ", - "1.833,0.95,-335.19 ", - "2.200,0.94,-528.77 ", - "2.750,0.93,-883.40 ", - "4.400,0.92,-2462.17 ", - "11.000,0.91,-16540.98 ", - }; - var tqData = - TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", - tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), - 0.1.SI<MeterPerSquareSecond>()); - - var operatingPoint = tqData.FindOperatingPointForPowerDemand(20000.SI<Watt>(), 113.5.SI<PerSecond>(), - 1200.RPMtoRad(), 4.SI<KilogramSquareMeter>(), 0.5.SI<Second>(), 20000.SI<Watt>()); - - var tmp = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity, 0.RPMtoRad()); - var backward = tmp.First(); - +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using NLog.Targets; +using NUnit.Framework; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.InputData.FileIO.JSON; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; +using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; + +namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData +{ + [TestFixture] + public class TorqueConverterDataTest + { + [Test] + public void TestTorqueConverterDataDeclarationMode() + { + var tqInput = new[] { + "0.0,1.80,377.80 ", + "0.1,1.71,365.21 ", + "0.2,1.61,352.62 ", + "0.3,1.52,340.02 ", + "0.4,1.42,327.43 ", + "0.5,1.33,314.84 ", + "0.6,1.23,302.24 ", + "0.7,1.14,264.46 ", + "0.8,1.04,226.68 ", + "0.9,0.95,188.90 ", + "1.0,0.95,0.00 ", + "1.100,0.99,-40.34 ", + "1.222,0.98,-80.34 ", + "1.375,0.97,-136.11 ", + "1.571,0.96,-216.52 ", + "1.833,0.95,-335.19 ", + "2.200,0.94,-528.77 ", + "2.750,0.93,-883.40 ", + "4.400,0.92,-2462.17 ", + "11.000,0.91,-16540.98 ", + }; + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", + tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + // check input data + Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); + Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); + Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); + + Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9); + Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9); + Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9); + + // check appended data + + Assert.AreEqual(0.959, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9); + Assert.AreEqual(-2290, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9); + Assert.AreEqual(5, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9); + } + + [Test] + public void TestTorqueConverterExtendPowersplit() + { + var tqInput = new[] { + "0.0,1.80,377.80 ", + "0.1,1.71,365.21 ", + "0.2,1.61,352.62 ", + "0.3,1.52,340.02 ", + "0.4,1.42,327.43 ", + "0.5,1.33,314.84 ", + "0.6,1.23,302.24 ", + "0.7,1.14,264.46 ", + "0.8,1.04,226.68 ", + "0.9,0.95,188.90 ", + "1.0,0.95,0.00 ", + "1.100,0.99,-40.34 ", + "1.222,0.98,-80.34 ", + "1.375,0.97,-136.11 ", + "1.571,0.96,-216.52 ", + "1.833,0.95,-335.19 ", + "2.200,0.94,-528.77 ", + "2.750,0.93,-883.40 ", + "4.400,0.92,-2462.17 ", + "11.000,0.91,-16540.98 ", + }; + + var ratio = 0.75; + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", + tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Declaration, ratio, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + // check input data + Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); + Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); + Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); + + Assert.AreEqual(1.14, tqData.TorqueConverterEntries[7].TorqueRatio, 1e-9); + Assert.AreEqual(264.46, tqData.TorqueConverterEntries[7].Torque.Value(), 1e-9); + Assert.AreEqual(0.7, tqData.TorqueConverterEntries[7].SpeedRatio, 1e-9); + + // check appended data + + Assert.AreEqual(0.959 / ratio, tqData.TorqueConverterEntries[18].TorqueRatio, 1e-9); + Assert.AreEqual(-2290, tqData.TorqueConverterEntries[18].Torque.Value(), 1e-9); + Assert.AreEqual(5 * ratio, tqData.TorqueConverterEntries[18].SpeedRatio, 1e-9); + } + + [Test] + public void TestTorqueConverterDataEngneeringMode_Append() + { + var tqInput = new[] { + "0.0,1.80,377.80 ", + "0.1,1.71,365.21 ", + "0.2,1.61,352.62 ", + "0.3,1.52,340.02 ", + "0.4,1.42,327.43 ", + "0.5,1.33,314.84 ", + "0.6,1.23,302.24 ", + "0.7,1.14,264.46 ", + "0.8,1.04,226.68 ", + "0.9,0.95,188.90 ", + }; + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", + tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + // check input data + Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); + Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); + Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); + + Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9); + Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9); + Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9); + + // check appended data + Assert.AreEqual(0.999, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9); + Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9); + Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9); + + Assert.AreEqual(0.959, tqData.TorqueConverterEntries[50].TorqueRatio, 1e-9); + Assert.AreEqual(-2290, tqData.TorqueConverterEntries[50].Torque.Value(), 1e-9); + Assert.AreEqual(5, tqData.TorqueConverterEntries[50].SpeedRatio, 1e-9); + } + + [Test] + public void TestTorqueConverterDataEngineeringMode_Unmodified() + { + var tqInput = new[] { + "0.0,1.80,377.80 ", + "0.1,1.71,365.21 ", + "0.2,1.61,352.62 ", + "0.3,1.52,340.02 ", + "0.4,1.42,327.43 ", + "0.5,1.33,314.84 ", + "0.6,1.23,302.24 ", + "0.7,1.14,264.46 ", + "0.8,1.04,226.68 ", + "0.9,0.95,188.90 ", + "1.0,0.95,0.00 ", + "1.100,0.99,-40.34 ", + "1.222,0.98,-80.34 ", + "1.375,0.97,-136.11 ", + "1.571,0.96,-216.52 ", + "1.833,0.95,-335.19 ", + "2.200,0.94,-528.77 ", + "2.750,0.93,-883.40 ", + "4.400,0.92,-2462.17 ", + "11.000,0.91,-16540.98 ", + }; + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio, MP1000", + tqInput), 1000.RPMtoRad(), 1600.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + // check input data + Assert.AreEqual(1.8, tqData.TorqueConverterEntries[0].TorqueRatio, 1e-9); + Assert.AreEqual(377.8, tqData.TorqueConverterEntries[0].Torque.Value(), 1e-9); + Assert.AreEqual(0, tqData.TorqueConverterEntries[0].SpeedRatio, 1e-9); + + Assert.AreEqual(0.95, tqData.TorqueConverterEntries[9].TorqueRatio, 1e-9); + Assert.AreEqual(188.90, tqData.TorqueConverterEntries[9].Torque.Value(), 1e-9); + Assert.AreEqual(0.9, tqData.TorqueConverterEntries[9].SpeedRatio, 1e-9); + + Assert.AreEqual(0.95, tqData.TorqueConverterEntries[10].TorqueRatio, 1e-9); + Assert.AreEqual(0, tqData.TorqueConverterEntries[10].Torque.Value(), 1e-9); + Assert.AreEqual(1, tqData.TorqueConverterEntries[10].SpeedRatio, 1e-9); + + Assert.AreEqual(0.91, tqData.TorqueConverterEntries[19].TorqueRatio, 1e-9); + Assert.AreEqual(-16540.98, tqData.TorqueConverterEntries[19].Torque.Value(), 1e-9); + Assert.AreEqual(11, tqData.TorqueConverterEntries[19].SpeedRatio, 1e-9); + } + + [Test, + TestCase(30, 10, 227.8707, 1780.6630), + TestCase(40, 10, 197.9536, 1340.4737), + TestCase(50, 10, 177.6759, 1076.9007), + TestCase(60, 10, 162.8219, 901.5900), + TestCase(70, 10, 151.3747, 776.6864), + TestCase(70, 30, 259.9515, 2306.1578), + TestCase(90, 10, 134.7344, 610.8267), + TestCase(90, 30, 230.4896, 1805.2978), + TestCase(170, 30, 172.2875, 987.4020), + TestCase(170, 50, 220.2397, 1626.0613), + TestCase(190, 30, 164.3260, 892.7507), + TestCase(190, 50, 209.6016, 1465.6611), + TestCase(190, 70, 246.4829, 2036.7399), + TestCase(530.517, 1.930, 59.0758, 35.8217), + ] + public void TestTorqueConverterOperatingPoint(double nOut, double Pout, double nInExpected, double tqInExpected) + { + var tqLimit = 1600; + //Assert.IsTrue(nInExpected < tqLimit); + var tqInput = new[] { + "0.0,1.80,377.80", + "0.1,1.71,365.21", + "0.2,1.61,352.62", + "0.3,1.52,340.02", + "0.4,1.42,327.43", + "0.5,1.33,314.84", + "0.6,1.23,302.24", + "0.7,1.14,264.46", + "0.8,1.04,226.68", + "0.9,0.95,188.90", + "1.0,0.95,0.00", + }; + + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", + tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + var outAngularSpeed = nOut.RPMtoRad(); + var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed; + var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>()); + Assert.AreEqual(1, resultList.Count); + var result = resultList[0]; + + Assert.AreEqual(outAngularSpeed.Value(), result.OutAngularVelocity.Value(), 1e-3); + Assert.AreEqual(outTorque.Value(), result.OutTorque.Value(), 1e-3); + + //Debug.WriteLine("n_in: {0}, tq_in: {1}", result.InAngularVelocity.AsRPM, result.InTorque.Value()); + //Assert.IsTrue(result.InAngularVelocity.Value() < 1600.RPMtoRad().Value()); + Assert.AreEqual(nInExpected, result.InAngularVelocity.Value(), 1e-3); + Assert.AreEqual(tqInExpected, result.InTorque.Value(), 1e-3); + } + + [Test, + TestCase(898, 463)] + public void TestTorqueConverterOperatingPointForward(double nIn, double tqIn) + { + var tqLimit = 1600; + + var tqInput = new[] { + "0.0, 4.5, 700", + "0.1, 3.5, 640 ", + "0.2, 2.7, 560 ", + "0.3, 2.2, 460 ", + "0.4, 1.6, 350 ", + "0.5, 1.2, 250 ", + "0.6, 0.9, 160 ", + "0.74, 0.9, 1", + }; + + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", + tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + var operatingPoint = tqData.FindOperatingPointForward(tqIn.SI<NewtonMeter>(), nIn.RPMtoRad(), null); + + Assert.AreEqual(operatingPoint.InTorque.Value(), tqIn, 1e-6); + Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), nIn.RPMtoRad().Value(), 1e-6); + + var resultList = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity, + 0.SI<PerSecond>()); + Assert.AreEqual(1, resultList.Count); + var reverseOP = resultList[0]; + + Assert.AreEqual(operatingPoint.InTorque.Value(), reverseOP.InTorque.Value(), 1e-6); + Assert.AreEqual(operatingPoint.OutTorque.Value(), reverseOP.OutTorque.Value(), 1e-6); + Assert.AreEqual(operatingPoint.InAngularVelocity.Value(), reverseOP.InAngularVelocity.Value(), 1e-6); + Assert.AreEqual(operatingPoint.OutAngularVelocity.Value(), reverseOP.OutAngularVelocity.Value(), 1e-6); + } + + [Test] + public void TestTorqueConverterComparisonV2() + { + var tqLimit = 1600; + + var tqInput = new[] { + "0.0,1.80,377.80", + "0.1,1.71,365.21", + "0.2,1.61,352.62", + "0.3,1.52,340.02", + "0.4,1.42,327.43", + "0.5,1.33,314.84", + "0.6,1.23,302.24", + "0.7,1.14,264.46", + "0.8,1.04,226.68", + "0.9,0.95,188.90", + "1.0,0.95,0.00", + }; + var testData = new List<Tuple<double, double>>() { + Tuple.Create(139.4087374, 72.74847642), + Tuple.Create(2275.286998, 453.9413043), + Tuple.Create(1507.256216, 1012.44118), + Tuple.Create(26.58522419, 29.25312925), + Tuple.Create(1752.83589, 328.6386397), + }; + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", + tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + foreach (var entry in testData) { + var torqueTCOut = entry.Item1.SI<NewtonMeter>(); + var angularSpeedOut = entry.Item2.RPMtoRad(); + var result = tqData.FindOperatingPoint(torqueTCOut, angularSpeedOut, 0.SI<PerSecond>()).First(); + //Debug.WriteLine("n_out: {0}, tq_out: {1}, n_in: {2}, Tq_in: {3}", angularSpeedOut.Value() / Constants.RPMToRad, + // torqueTCOut.Value(), result.InAngularVelocity.Value() / Constants.RPMToRad, result.InTorque.Value()); + } + } + + [Test, + TestCase(10, 110), + TestCase(20, 130), + TestCase(50, 90), + TestCase(50, 190), + TestCase(60, 150), + TestCase(70, 70), + TestCase(70, 90), + TestCase(70, 190), + TestCase(80, 50), + TestCase(80, 130), + TestCase(90, 70), + TestCase(100, 150), + TestCase(130, 70), + TestCase(150, 80), + TestCase(170, 80), + ] + public void TestTorqueConverterInvalidOperatingPoint(double nOut, double Pout) + { + var tqLimit = 1600.RPMtoRad(); + + var tqInput = new[] { + "0,3.935741,563.6598 ", + "0.1,3.296827,534.1364", + "0.2,2.701476,504.6129", + "0.3,2.265852,472.1372", + "0.4,1.931875,421.9474", + "0.5,1.554335,354.0435", + "0.6,1.249399,268.4255", + "0.7,1.075149,114.9037", + }; + + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", + tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + var outAngularSpeed = nOut.RPMtoRad(); + var outTorque = (Pout * 1000).SI<Watt>() / outAngularSpeed; + var resultList = tqData.FindOperatingPoint(outTorque, outAngularSpeed, 0.SI<PerSecond>()); + Assert.AreEqual(1, resultList.Count); + var result = resultList[0]; + + Assert.IsTrue(result.InAngularVelocity.Value() > tqLimit.Value()); + } + + [TestCase()] + public void TestForwardBackward() + { + var tqLimit = 1600.RPMtoRad(); + + var tqInput = new[] { + "0,4.6,708 ", + "0.1,3.7,641 ", + "0.2,2.9,560 ", + "0.3,2.4,465 ", + "0.4,1.8,356 ", + "0.5,1.4,251 ", + "0.6,0.9,166 ", + "0.735,0.9,1 ", + "0.738,1.361,0 ", + "0.808,1.351,-40 ", + "0.898,1.349,-80 ", + "1.01,1.338,-136 ", + "1.154,1.327,-217 ", + "1.347,1.316,-335 ", + "1.616,1.305,-529 ", + "3 ,1.294,-729 ", + }; + + var tqInput_1 = new[] { + "0.0,1.80,377.80 ", + "0.1,1.71,365.21 ", + "0.2,1.61,352.62 ", + "0.3,1.52,340.02 ", + "0.4,1.42,327.43 ", + "0.5,1.33,314.84 ", + "0.6,1.23,302.24 ", + "0.7,1.14,264.46 ", + "0.8,1.04,226.68 ", + "0.9,0.95,188.90 ", + "1.0,0.95,0.00 ", + "1.100,0.99,-40.34 ", + "1.222,0.98,-80.34 ", + "1.375,0.97,-136.11 ", + "1.571,0.96,-216.52 ", + "1.833,0.95,-335.19 ", + "2.200,0.94,-528.77 ", + "2.750,0.93,-883.40 ", + "4.400,0.92,-2462.17 ", + "11.000,0.91,-16540.98 ", + }; + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", + tqInput), 1000.RPMtoRad(), tqLimit, ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + var operatingPoint = tqData.FindOperatingPointForPowerDemand(20000.SI<Watt>(), 113.5.SI<PerSecond>(), + 1200.RPMtoRad(), 4.SI<KilogramSquareMeter>(), 0.5.SI<Second>(), 20000.SI<Watt>()); + + var tmp = tqData.FindOperatingPoint(operatingPoint.OutTorque, operatingPoint.OutAngularVelocity, 0.RPMtoRad()); + var backward = tmp.First(); + Console.WriteLine(operatingPoint); Console.WriteLine(operatingPoint.InAngularVelocity * operatingPoint.InTorque); Console.WriteLine(backward); - Console.WriteLine(backward.InAngularVelocity * backward.InTorque); - - Assert.AreEqual(backward.OutAngularVelocity.Value(), operatingPoint.OutAngularVelocity.Value(), 1e-9); - Assert.AreEqual(backward.OutTorque.Value(), operatingPoint.OutTorque.Value(), 1e-9); - Assert.AreEqual(backward.InAngularVelocity.Value(), operatingPoint.InAngularVelocity.Value(), 1e-9); - Assert.AreEqual(backward.InTorque.Value(), operatingPoint.InTorque.Value(), 1e-9); - } - } + Console.WriteLine(backward.InAngularVelocity * backward.InTorque); + + Assert.AreEqual(backward.OutAngularVelocity.Value(), operatingPoint.OutAngularVelocity.Value(), 1e-9); + Assert.AreEqual(backward.OutTorque.Value(), operatingPoint.OutTorque.Value(), 1e-9); + Assert.AreEqual(backward.InAngularVelocity.Value(), operatingPoint.InAngularVelocity.Value(), 1e-9); + Assert.AreEqual(backward.InTorque.Value(), operatingPoint.InTorque.Value(), 1e-9); + } + + + [Test] + public void TestTorqueConverterBehavior() + { + var tqLimit = 1600; + + var tqInput = new[] { + "0.0,1.80,377.80", + "0.1,1.71,365.21", + "0.2,1.61,352.62", + "0.3,1.52,340.02", + "0.4,1.42,327.43", + "0.5,1.33,314.84", + "0.6,1.23,302.24", + "0.7,1.14,264.46", + "0.8,1.04,226.68", + "0.9,0.95,188.90", + "1.0,0.95,0.00", + }; + + var tqInput2 = new[] { + "0.0000,1.80,554.30", + "0.6000,1.23,443.44", + "0.9000,0.95,277.15", + "1.0000,0.95,0.00", + "5,0.959,-2290" + }; + + var tqData = + TorqueConverterDataReader.ReadFromStream(InputDataHelper.InputDataAsStream("Speed Ratio, Torque Ratio,MP1000", + tqInput), 1000.RPMtoRad(), tqLimit.RPMtoRad(), ExecutionMode.Engineering, 1, 0.1.SI<MeterPerSquareSecond>(), + 0.1.SI<MeterPerSquareSecond>()); + + var outSpeed = 1200.RPMtoRad(); + var results = new Dictionary<NewtonMeter, IList<TorqueConverterOperatingPoint>>(); + for (var t = -2000; t < 2000; t += 10) { + var op = tqData.FindOperatingPoint(t.SI<NewtonMeter>(), outSpeed, 0.RPMtoRad()); + results[t.SI<NewtonMeter>()] = op; + } + + foreach (var result in results) { + var tmp = result.Value.FirstOrDefault(); + Console.WriteLine("speed_out: {0}, torque_out: {1}, speed_in: {2}, torque_in: {3}", outSpeed.AsRPM, result.Key, tmp?.InAngularVelocity.AsRPM, tmp?.InTorque); + } + } + + [TestCase] + public void TestOperatingPointSearch() + { + var dao = new DeclarationDataAdapter(); + var gbxInputData = new JSONComponentInputData(@"E:\QUAM\Workspace\VECTO-Bugreports\BugReportTests\Bugreport Jobs\20181204_Daimler_VECTO-797_CTTWDB9560342V252797_DrivingAction\Allison_3000_P-6_3.49-0.65_6.824-A2G__CTTWDB9560342V252797.vgbx", null); + var engineInputData = new JSONComponentInputData( + @"E:\QUAM\Workspace\VECTO-Bugreports\BugReportTests\Bugreport Jobs\20181204_Daimler_VECTO-797_CTTWDB9560342V252797_DrivingAction\OM936LA200kW1100Nm-1.Gen-Euro6M5M-Euro6OBD-C_CTTWDB9560342V252797.veng", null); + + var engineData = dao.CreateEngineData(engineInputData.EngineInputData, 600.RPMtoRad(), gbxInputData.GearboxInputData, new List<ITorqueLimitInputData>()); + var tccData = dao.CreateGearboxData( + gbxInputData.GearboxInputData, engineData, + ((IVehicleDeclarationInputData)gbxInputData.Vehicle).AxleGearInputData.Ratio, 0.5.SI<Meter>(), + VehicleCategory.Tractor); + + var container = new MockVehicleContainer(); + + var runData = new VectoRunData() { + GearboxData = tccData, + EngineData = engineData + }; + var shiftStrategy = new ATShiftStrategy(tccData, container); + var gearbox = new ATGearbox(container, shiftStrategy, runData); // new MockGearbox(container); + var tc = new TorqueConverter( + gearbox, shiftStrategy, container, tccData.TorqueConverterData, runData); + var engine = new CombustionEngine(container, engineData); + container.Engine = engine; + + tc.Connect(engine); + + gearbox.Gear = 2; + tc.Initialize(100.SI<NewtonMeter>(), 680.RPMtoRad()); + + container.EngineSpeed = engine.EngineSpeed; + + var absTime = 0.SI<Second>(); + var dt = 0.2.SI<Second>(); + + gearbox.Gear = 1; + + var outTorque = 70.SI<NewtonMeter>(); + var outSpeed = 1200.RPMtoRad(); + tc.PreviousState.InTorque = 410.SI<NewtonMeter>(); + var response = tc.Request(absTime, dt, outTorque, outSpeed); + + Assert.IsInstanceOf<ResponseOverload>(response); + + response = tc.Request(absTime, dt, outTorque, outSpeed, true); + Assert.IsInstanceOf<TorqueConverter>(response.Source); + + var delta = ((ResponseDryRun)response).DeltaFullLoad; + outTorque = SearchAlgorithm.Search( + outTorque, delta, 20.SI<NewtonMeter>(), + getYValue: rsp => { + var r = (ResponseDryRun)rsp; + return r.DeltaFullLoad; + }, + evaluateFunction: t => { + return tc.Request(absTime, dt, t, outSpeed, true); + }, + criterion: rsp => { + var r = (ResponseDryRun)rsp; + return r.DeltaFullLoad.Value(); + }); + + response = tc.Request(absTime, dt, outTorque, outSpeed); + Assert.IsInstanceOf<ResponseSuccess>(response); + } + } } \ No newline at end of file