diff --git a/VECTO/Input Files/Engine.vb b/VECTO/Input Files/Engine.vb index bdac83d0dfd1eb9ee5251fc595bc31cf5b0879d9..c091b259bc2400670b5f34c3a122d3d5907bd1b7 100644 --- a/VECTO/Input Files/Engine.vb +++ b/VECTO/Input Files/Engine.vb @@ -159,7 +159,7 @@ Public Class Engine Dim messages As IEnumerable(Of String) = validationResults.Select(Function(r) r.ErrorMessage + String.Join(", ", r.MemberNames.Distinct())) MsgBox("Invalid input." + Environment.NewLine + String.Join(Environment.NewLine, messages), MsgBoxStyle.OkOnly, - "Failed to save gearbox") + "Failed to save engine") Return False End If diff --git a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs index 5276b5372d50e74787d1be2cff5f2e5947599237..e0b5b5b5bc8967b42a7697d2a8947e1c9b5e48a4 100644 --- a/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/FullLoadCurveReader.cs @@ -84,6 +84,12 @@ namespace TUGraz.VectoCore.InputData.Reader tmp = data.Columns.Count > 3 ? new PT1(data) : new PT1(); } entriesFld.Sort((entry1, entry2) => entry1.EngineSpeed.Value().CompareTo(entry2.EngineSpeed.Value())); + var duplicates = entriesFld.Select(x => x.EngineSpeed.AsRPM).GroupBy(x => x).Where(g => g.Count() > 1) + .Select(g => g.Key).ToList(); + if (duplicates.Count > 0) { + throw new VectoException( + "Error reading full-load curve: multiple entries for engine speeds {0}", string.Join(", ", duplicates)); + } return new EngineFullLoadCurve(entriesFld, tmp); } diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs index ec13cfb79e8f5c0022de2403620ac91de9547e2a..e207b009223d58427c11cc5d358bb82deff394db 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FullLoadCurveTest.cs @@ -341,5 +341,29 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData Assert.AreEqual(1352, fldCurve.FullLoadStationaryTorque(2000.RPMtoRad()).Value(), Tolerance); Assert.AreEqual(1231, fldCurve.FullLoadStationaryTorque(580.RPMtoRad()).Value(), Tolerance); } + + [TestCase] + public void TestDuplicateEntries() + { + var fldData = new[] { + "560,1180,-149,0.6", + "600,1282,-148,0.6", + "800,1791,-149,0.6", + "1000,2300,-160,0.6", + "1200,2400,-179,0.6", + "1400,2300,-203,0.6", + "1600,2079,-235,0.49", + "1800,1857,-264,0.25", + "2000,1352,-301,0.25", + "2100,1100,-320,0.25", + "1200,2410,-180,0.6", + }; + var fldEntries = InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm],<PT1> [s] ", fldData); + + AssertHelper.Exception<VectoException>( + () => { + var fldCurve = FullLoadCurveReader.Create(VectoCSVFile.ReadStream(fldEntries)); + }, messageContains: "Error reading full-load curve: multiple entries for engine speeds 1200"); + } } } \ No newline at end of file