From 110285b12346b719ad78e8950a209a63b48af3d1 Mon Sep 17 00:00:00 2001 From: Michael Krisper <michael.krisper@tugraz.at> Date: Wed, 1 Jun 2016 17:21:31 +0200 Subject: [PATCH] corrected last line in 1Hz interpolation --- .../VectoCore/OutputData/ModalDataContainer.cs | 16 ++++++++++++++-- .../Integration/FullCycleDeclarationTest.cs | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index 3a9ce33ecf..6b2e33f3ef 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -274,11 +274,12 @@ namespace TUGraz.VectoCore.OutputData object[] remainingRow = null; var gearsList = new Dictionary<object, Second>(3); + var v_act = 0.SI<MeterPerSecond>(); foreach (DataRow row in data.Rows) { var currentDt = row.Field<Second>((int)ModalResultField.simulationInterval); distance = row.Field<Meter>((int)ModalResultField.dist); - var v_act = (MeterPerSecond)row[(int)ModalResultField.v_act]; + v_act = (MeterPerSecond)row[(int)ModalResultField.v_act]; // if current + remaining time >= 1 second: take remaining row and split up currentRow to fill up 1 second. if (remainingDt > 0 && remainingDt + currentDt >= 1) { @@ -297,6 +298,7 @@ namespace TUGraz.VectoCore.OutputData r[(int)ModalResultField.simulationInterval] = 1.SI<Second>(); r[(int)ModalResultField.Gear] = gearsList.MaxBy(kv => kv.Value).Key; r[(int)ModalResultField.dist] = distance; + r[(int)ModalResultField.v_act] = v_act; gearsList.Clear(); results.Rows.Add(r); @@ -318,6 +320,7 @@ namespace TUGraz.VectoCore.OutputData r[(int)ModalResultField.time] = absTime; r[(int)ModalResultField.simulationInterval] = dt; r[(int)ModalResultField.dist] = distance; + r[(int)ModalResultField.v_act] = v_act; results.Rows.Add(r); } @@ -327,6 +330,7 @@ namespace TUGraz.VectoCore.OutputData gearsList[gear] = gearsList.GetValueOrZero(gear) + currentDt; distance += currentDt * v_act + currentDt * currentDt * (MeterPerSquareSecond)row[(int)ModalResultField.acc] / 2; + v_act += currentDt * (MeterPerSquareSecond)row[(int)ModalResultField.acc]; remainingRow = AddRow(remainingRow, MultiplyRow(row.ItemArray, currentDt)); remainingDt += currentDt; absTime += currentDt; @@ -338,13 +342,21 @@ namespace TUGraz.VectoCore.OutputData } // if last row was not enough to full second: take last row as whole second + if (remainingDt > 0) { + var last = data.Rows.Cast<DataRow>().Last(); var r = results.NewRow(); - r.ItemArray = remainingRow; + + r.ItemArray = MultiplyRow(remainingRow, 1 / remainingDt).ToArray(); + distance += remainingDt * v_act + + remainingDt * remainingDt * (MeterPerSquareSecond)last[(int)ModalResultField.acc] / 2; + v_act += remainingDt * (MeterPerSquareSecond)last[(int)ModalResultField.acc]; + r[(int)ModalResultField.time] = VectoMath.Ceiling(absTime); r[(int)ModalResultField.simulationInterval] = 1.SI<Second>(); r[(int)ModalResultField.Gear] = gearsList.MaxBy(kv => kv.Value).Key; r[(int)ModalResultField.dist] = distance; + r[(int)ModalResultField.v_act] = v_act; results.Rows.Add(r); } diff --git a/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs b/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs index 83b811b784..ab742c192f 100644 --- a/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs +++ b/VectoCore/VectoCoreTest/Integration/FullCycleDeclarationTest.cs @@ -255,7 +255,7 @@ namespace TUGraz.VectoCore.Tests.Integration modFile1Hz.Rows.Cast<DataRow>() .Select(r => r.ParseDoubleOrGetDefault(ModalResultField.FCWHTCc.GetShortCaption())) .Sum(); - AssertHelper.AreRelativeEqual(sumFuelConsumption, sumFuelConsumption1Hz, "Fuel Consumption is not equal", 1e-5); + AssertHelper.AreRelativeEqual(sumFuelConsumption, sumFuelConsumption1Hz, "Fuel Consumption is not equal", 1e-4); } [TestMethod, TestCategory("LongRunning")] -- GitLab