diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs index f4c161688f994605634d4df5469362fc60578ca2..8665e626c28e1a996df5b816f18811e4068c759b 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using NUnit.Framework; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.Reader.DataObjectAdaper; @@ -295,21 +296,21 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration // Gear 1 new[] { new Point(136.9338946, -352), - new Point(136.9338946, 1492.7289), - new Point(203.9530637, 2530), + new Point(136.9338946, 1281.30911), + new Point(201.7326, 2427.6748), }, // Gear 2 new[] { new Point(136.9338946, -352), - new Point(136.9338946, 1518.81917), - new Point(201.3375424, 2530), + new Point(136.9338946, 1281.30911), + new Point(203.9530, 2466.9558), }, // Gear 3 new[] { new Point(136.9338946, -352), - new Point(136.9338946, 1538.9278), - new Point(153.606666, 1893.19273), - new Point(192.102071, 2530), + new Point(136.9338946, 1281.30911), + //new Point(153.606666, 1893.19273), + new Point(201.3375, 2420.6842), }, }; @@ -340,28 +341,41 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration } - //[TestMethod] - //public void CompueShiftPolygonDeclarationTestConfidentialEngine() - //{ - // var engineFldFile = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld"; - // var gearboxFile = @"TestData\Components\40t_Long_Haul_Truck.vgbx"; + [TestMethod] + public void CompueShiftPolygonDeclarationTestConfidentialEngine() + { + var engineFldFile = @"E:\QUAM\Downloads\EngineFLD\Map_375c_BB1390_modTUG_R49_375c_BB1386.vfld"; + var gearboxFile = @"TestData\Components\40t_Long_Haul_Truck.vgbx"; + + var rdyn = 0.4882675.SI<Meter>(); + var axlegearRatio = 2.59; - // var rdyn = 0.4882675.SI<Meter>(); - // var axlegearRatio = 2.59; + var engineData = new CombustionEngineData() { + IdleSpeed = 509.RPMtoRad(), + FullLoadCurve = EngineFullLoadCurve.ReadFromFile(engineFldFile, true) + }; + engineData.FullLoadCurve.EngineData = engineData; - // var engineData = new CombustionEngineData() { - // IdleSpeed = 509.RPMtoRad(), - // FullLoadCurve = EngineFullLoadCurve.ReadFromFile(engineFldFile, true) - // }; + var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile); - // var gearboxData = new JSONGearboxDataV5(JSONInputDataFactory.ReadFile(gearboxFile), gearboxFile); + var shiftPolygons = new List<ShiftPolygon>(); + var downshiftTransformed = new List<List<Point>>(); + var upshiftOrig = new List<List<Point>>(); + for (var i = 0; i < gearboxData.Gears.Count; i++) { + shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurve, gearboxData.Gears, + engineData, axlegearRatio, rdyn)); + List<Point> tmp1, tmp2; + ShiftPolygonComparison.ComputShiftPolygonPoints(i, engineData.FullLoadCurve, gearboxData.Gears, + engineData, axlegearRatio, rdyn, out tmp1, out tmp2); + upshiftOrig.Add(tmp1); + downshiftTransformed.Add(tmp2); + } - // var shiftPolygons = new List<ShiftPolygon>(); - // for (var i = 1; i <= gearboxData.Gears.Count; i++) { - // shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurve, gearboxData.Gears, - // engineData, axlegearRatio, rdyn)); - // } - //} + ShiftPolygonDrawer.DrawShiftPolygons(Path.GetDirectoryName(gearboxFile), engineData.FullLoadCurve, shiftPolygons, + "R49_375c_BB1386.png", + DeclarationData.Gearbox.TruckMaxAllowedSpeed / rdyn * axlegearRatio * gearboxData.Gears.Last().Ratio, upshiftOrig, + downshiftTransformed); + } } [TestFixture] @@ -403,11 +417,18 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Path.Combine(BasePath, gearboxFile)); var shiftPolygons = new List<ShiftPolygon>(); + var downshiftTransformed = new List<List<Point>>(); + var upshiftOrig = new List<List<Point>>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { shiftPolygons.Add( DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurve, gearboxData.Gears, engineData, axlegearRatio, rdyn.SI<Meter>()) ); + List<Point> tmp1, tmp2; + ComputShiftPolygonPoints(i, engineData.FullLoadCurve, gearboxData.Gears, + engineData, axlegearRatio, rdyn.SI<Meter>(), out tmp1, out tmp2); + upshiftOrig.Add(tmp1); + downshiftTransformed.Add(tmp2); } var imageFile = Path.GetDirectoryName(gearboxFile) + "_" + Path.GetFileNameWithoutExtension(gearboxFile) + "_" + @@ -415,7 +436,56 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration ".png"; ShiftPolygonDrawer.DrawShiftPolygons(Path.GetDirectoryName(gearboxFile), engineData.FullLoadCurve, shiftPolygons, imageFile, - DeclarationData.Gearbox.TruckMaxAllowedSpeed / rdyn.SI<Meter>() * axlegearRatio * gearboxData.Gears.Last().Ratio); + DeclarationData.Gearbox.TruckMaxAllowedSpeed / rdyn.SI<Meter>() * axlegearRatio * gearboxData.Gears.Last().Ratio, + upshiftOrig, downshiftTransformed); + } + + + public static void ComputShiftPolygonPoints(int gear, FullLoadCurve fullLoadCurve, + IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius, + out List<Point> upshiftOrig, out List<Point> downshiftTransformed) + { + var engineSpeed85kmhLastGear = DeclarationData.Gearbox.TruckMaxAllowedSpeed / dynamicTyreRadius * axlegearRatio * + gears[gears.Count - 1].Ratio; + //var engineSpeed85kmhSecondToLastGear = ComputeEngineSpeed85kmh(gears[gears.Count - 2], axlegearRatio, + // dynamicTyreRadius, engine); + + var nVHigh = VectoMath.Min(engineSpeed85kmhLastGear, engine.FullLoadCurve.RatedSpeed); + + var diffRatio = gears[gears.Count - 2].Ratio / gears[gears.Count - 1].Ratio - 1; + + var maxDragTorque = engine.FullLoadCurve.MaxDragTorque * 1.1; + + var p1 = new Point(engine.IdleSpeed.Value() / 2, 0); + var p2 = new Point(engine.IdleSpeed.Value() * 1.1, 0); + var p3 = new Point(nVHigh.Value() * 0.9, + engine.FullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value()); + + var p4 = + new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0); + var p5 = new Point(engine.FullLoadCurve.N95hSpeed.Value(), engine.FullLoadCurve.MaxTorque.Value()); + + var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X)); + var p7 = new Point(p4.X, VectoMath.Interpolate(p2, p5, p4.X)); + + //var fldMargin = ShiftPolygonFldMargin(fullLoadCurve.FullLoadEntries, nVHigh * 0.95); + //var downshiftCorr = MoveDownshiftBelowFld(Edge.Create(p6, p3), fldMargin, 1.1 * fullLoadCurve.MaxTorque); + upshiftOrig = new[] { p4, p7, p5 }.ToList(); + downshiftTransformed = new List<Point>(); + + if (gear >= gears.Count - 1) { + return; + } + var gearRatio = gears[gear].Ratio / gears[gear + 1].Ratio; + var rpmMarginFactor = 1 + DeclarationData.Gearbox.ShiftPolygonRPMMargin / 100.0; + + var p2p = new Point(p2.X * gearRatio * rpmMarginFactor, p2.Y / gearRatio); + var p3p = new Point(p3.X * gearRatio * rpmMarginFactor, p3.Y / gearRatio); + var p6p = new Point(p6.X * gearRatio * rpmMarginFactor, p6.Y / gearRatio); + var edgeP6pP3p = new Edge(p6p, p3p); + var p3pExt = new Point((1.1 * p5.Y - edgeP6pP3p.OffsetXY) / edgeP6pP3p.SlopeXY, 1.1 * p5.Y); + + downshiftTransformed = new[] { p2p, p6p, p3pExt }.ToList(); } } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs index 9905292d30558c6ae61db83f30de74d3f90c7a55..acf8d38e7c4653113ac662e759871815e1630d92 100644 --- a/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs +++ b/VectoCore/VectoCoreTest/Utils/ShiftPolygonDrawer.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Linq; @@ -8,6 +9,7 @@ using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using Point = TUGraz.VectoCore.Utils.Point; namespace TUGraz.VectoCore.Tests.Utils { @@ -17,10 +19,11 @@ namespace TUGraz.VectoCore.Tests.Utils private static readonly Font AxisTitleFont = new Font("Verdana", 12); private static readonly Font LegendFont = new Font("Verdana", 14); - private static Size _diagramSize = new Size(800, 800); + private static Size _diagramSize = new Size(1000, 800); public static void DrawShiftPolygons(string title, EngineFullLoadCurve engineFld, List<ShiftPolygon> polygons, - string imageFileName, PerSecond speed85kmh) + string imageFileName, PerSecond speed85kmh, List<List<Point>> upshiftOrig = null, + List<List<Point>> downshiftTransformed = null) { var numRows = Math.Ceiling(polygons.Count / 4.0); var numCols = Math.Ceiling(polygons.Count / numRows); @@ -30,16 +33,28 @@ namespace TUGraz.VectoCore.Tests.Utils }; var maxX = engineFld.FullLoadEntries.Last().EngineSpeed.Value() / Constants.RPMToRad * 1.1; - var i = 1; + var i = 0; foreach (var shiftPolygon in polygons) { var chartArea = AddChartArea(chart, "Gear " + (i + 1), "Engine Speed", "Torque", 0, maxX); + PlotPower(engineFld, chartArea, chart, "engine power " + i); PlotFLD(engineFld, speed85kmh, chartArea, chart, "Engine Full Load " + i); + if (upshiftOrig != null && i < upshiftOrig.Count) { + PlotShiftLine("UpshiftOrig " + i, chartArea, chart, Color.Gray, + upshiftOrig[i].Select(pt => pt.X / Constants.RPMToRad).ToList(), upshiftOrig[i].Select(pt => pt.Y).ToList(), true); + } + if (downshiftTransformed != null && i < downshiftTransformed.Count) { + PlotShiftLine("DownTransformed " + i, chartArea, chart, Color.BlueViolet, + downshiftTransformed[i].Select(pt => pt.X / Constants.RPMToRad).ToList(), + downshiftTransformed[i].Select(pt => pt.Y).ToList(), true); + } + PlotShiftPolygon(i, shiftPolygon, chartArea, chart); PositionChartArea(chartArea, 5, i, polygons.Count); + i++; } @@ -48,6 +63,34 @@ namespace TUGraz.VectoCore.Tests.Utils chart.SaveImage(imageFileName, ChartImageFormat.Png); } + private static void PlotPower(EngineFullLoadCurve engineFld, ChartArea chartArea, Chart chart, string name) + { + var series = new Series { + Name = name, + ChartType = SeriesChartType.Line, + Color = Color.DarkGoldenrod, + BorderWidth = 2, + //Legend = legend.Name, + IsVisibleInLegend = true, + ChartArea = chartArea.Name, + //YAxisType = AxisType.Secondary + }; + series.BorderDashStyle = ChartDashStyle.Dash; + series.BorderWidth = 1; + + var x = new List<double>(); + var y = new List<double>(); + for (var i = engineFld.FullLoadEntries.First().EngineSpeed; + i < engineFld.FullLoadEntries.Last().EngineSpeed; + i += 5.RPMtoRad()) { + x.Add(i.Value() / Constants.RPMToRad); + y.Add(engineFld.FullLoadStationaryPower(i).Value() / 1000); + } + + chart.Series.Add(series); + chart.Series[series.Name].Points.DataBindXY(x, y); + } + private static void AddTitle(Chart chart, string titleText) { var title = new Title { @@ -66,51 +109,54 @@ namespace TUGraz.VectoCore.Tests.Utils chartArea.Position.Auto = false; chartArea.Position.Width = (float)((100.0f) / numCols); chartArea.Position.Height = (float)((100.0f - titleHeight) / numRows); - chartArea.Position.X = (float)(((i - 1) % numCols) * 100.0f / numCols); - chartArea.Position.Y = (float)(titleHeight + (int)((i - 1) / numCols) * (100 - titleHeight) / numRows); + chartArea.Position.X = (float)(((i) % numCols) * 100.0f / numCols); + chartArea.Position.Y = (float)(titleHeight + (int)((i) / numCols) * (100 - titleHeight) / numRows); } private static void PlotShiftPolygon(int gear, ShiftPolygon shiftPolygon, ChartArea chartArea, Chart chart) { - var seriesDown = new Series { - Name = "DownShift " + gear, - ChartType = SeriesChartType.Line, - Color = Color.DarkRed, - BorderWidth = 2, - //Legend = legend.Name, - IsVisibleInLegend = true, - ChartArea = chartArea.Name, - }; - chart.Series.Add(seriesDown); var x = new List<double>(); var y = new List<double>(); foreach (var entry in shiftPolygon.Downshift) { x.Add(entry.AngularSpeed.Value() / Constants.RPMToRad); y.Add(entry.Torque.Value()); } - chart.Series[seriesDown.Name].Points.DataBindXY(x, y); + PlotShiftLine("DownShift " + gear, chartArea, chart, Color.DarkRed, x, y); + - var seriesUp = new Series { - Name = "UpShift " + gear, - ChartType = SeriesChartType.Line, - Color = Color.DarkRed, - BorderWidth = 2, - //Legend = legend.Name, - IsVisibleInLegend = true, - ChartArea = chartArea.Name, - }; - chart.Series.Add(seriesUp); var xUp = new List<double>(); var yUp = new List<double>(); foreach (var entry in shiftPolygon.Upshift) { xUp.Add(entry.AngularSpeed.Value() / Constants.RPMToRad); yUp.Add(entry.Torque.Value()); } - chart.Series[seriesUp.Name].Points.DataBindXY(xUp, yUp); + PlotShiftLine("UpShift " + gear, chartArea, chart, Color.DarkRed, xUp, yUp); + //return series; } + private static void PlotShiftLine(string name, ChartArea chartArea, Chart chart, Color color, List<double> x, + List<double> y, bool dashed = false) + { + var series = new Series { + Name = name, + ChartType = SeriesChartType.Line, + Color = color, + BorderWidth = 2, + //Legend = legend.Name, + IsVisibleInLegend = true, + ChartArea = chartArea.Name, + }; + if (dashed) { + series.BorderDashStyle = ChartDashStyle.Dash; + series.BorderWidth = 1; + } + + chart.Series.Add(series); + chart.Series[series.Name].Points.DataBindXY(x, y); + } + private static void PlotFLD(EngineFullLoadCurve engineFld, PerSecond speed85kmh, ChartArea chartArea, Chart chart, string name) {