diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index 132e5a478c2a8b20eeaecb5257e459e23779165a..f3c087df64d22f40d70a59fd3dd6b046a72cf324 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -267,8 +267,19 @@ namespace TUGraz.VectoCore.OutputData public static Meter Distance(this IModalDataContainer data) { - var max = data.Max<Meter>(ModalResultField.dist); - var min = data.Min<Meter>(ModalResultField.dist); + var max = data.GetValues<Meter>(ModalResultField.dist).LastOrDefault() ?? 0.SI<Meter>(); + var first = data.GetValues( + r => new { + dist = r.Field<Meter>((int)ModalResultField.dist), + vact = r.Field<MeterPerSecond>((int)ModalResultField.v_act), + acc = r.Field<MeterPerSquareSecond>((int)ModalResultField.acc), + dt = r.Field<Second>((int)ModalResultField.simulationInterval) + }).First(); + var min = 0.SI<Meter>(); + if (first != null && first.vact != null && first.acc != null && first.dt != null) { + min = first.dist - first.vact * first.dt - first.acc * first.dt * first.dt / 2.0; + } + return max == null || min == null ? null : max - min; } diff --git a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs index 9717eec19852867112ea8a7ad6388600a1266919..aa4ac83fd676e1fae089d2f9807c1c99b4be4954 100644 --- a/VectoCore/VectoCoreTest/Reports/ModDataTest.cs +++ b/VectoCore/VectoCoreTest/Reports/ModDataTest.cs @@ -60,6 +60,35 @@ namespace TUGraz.VectoCore.Tests.Reports Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory); } + [TestCase(80, 0), + TestCase(80, -0.1), + TestCase(10, 0.1)] + public void SumDataTest(double initialSpeedVal, double accVal) + { + var modData = new ModalDataContainer("sumDataTest", FuelType.DieselCI, null, false); + var initalSpeed = initialSpeedVal.KMPHtoMeterPerSecond(); + var speed = initalSpeed; + var dist = 0.SI<Meter>(); + var dt = 0.5.SI<Second>(); + var acc = accVal.SI<MeterPerSquareSecond>(); + for (var i = 0; i < 100; i++) { + modData[ModalResultField.v_act] = speed; + modData[ModalResultField.simulationInterval] = dt; + modData[ModalResultField.acc] = acc; + dist += speed * dt + acc * dt * dt / 2.0; + speed += acc * dt; + modData[ModalResultField.dist] = dist; + modData.CommitSimulationStep(); + } + + // distance = 80km/h * 50s + acc/2 * 50s * 50s + var totalTime = 50.SI<Second>(); + var expected = initalSpeed * totalTime + acc / 2.0 * totalTime * totalTime; + + Assert.AreEqual(expected.Value(), modData.Distance().Value(), 1e-6); + } + + [TestCase()] public void ModDataIntegritySimpleTest() { diff --git a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs index 32689fe80a08e147ac45d5a66b4d9769ee8877cc..55f65e631949f520a9ae96bd9caaf163edfd1220 100644 --- a/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs +++ b/VectoCore/VectoCoreTest/Reports/SumWriterTest.cs @@ -65,10 +65,10 @@ namespace TUGraz.VectoCore.Tests.Reports modData.AddAuxiliary("FAN"); - for (var i = 0; i < 499; i++) { + for (var i = 0; i < 500; i++) { modData[ModalResultField.simulationInterval] = 1.SI<Second>(); modData[ModalResultField.n_eng_avg] = 600.RPMtoRad(); - modData[ModalResultField.v_act] = 20.KMPHtoMeterPerSecond(); + modData[ModalResultField.v_act] = 1.SI<MeterPerSecond>(); //20.KMPHtoMeterPerSecond(); modData[ModalResultField.drivingBehavior] = DrivingBehavior.Driving; modData[ModalResultField.time] = i.SI<Second>(); modData[ModalResultField.dist] = i.SI<Meter>(); @@ -97,6 +97,10 @@ namespace TUGraz.VectoCore.Tests.Reports var sumData = VectoCSVFile.Read("testsumcalc_fixed.vsum", false, true); + // duration: 500s, distance: 500m + Assert.AreEqual(500, modData.Duration().Value()); + Assert.AreEqual(500, modData.Distance().Value()); + // 3kW * 500s => to kWh Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_air [kWh]"), 1e-3); Assert.AreEqual(500.0 * 3000.0 / 1000 / 3600, sumData.Rows[0].ParseDouble("E_aux_FAN [kWh]"), 1e-3); @@ -107,8 +111,8 @@ namespace TUGraz.VectoCore.Tests.Reports // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 500 => to g/h Assert.AreEqual((500.0 * 1e-4) * 1000 * 3600 / 500.0, sumData.Rows[0].ParseDouble("FC-Map [g/h]"), 1e-3); - // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 499m => to g/km - Assert.AreEqual((500.0 * 1e-4) * 1000 * 1000 / 499.0, sumData.Rows[0].ParseDouble("FC-Map [g/km]"), 1e-3); + // 500s * 1e-4 kg/s = 0.05kg => 0.05kg / 500m => to g/km + Assert.AreEqual((500.0 * 1e-4) * 1000 * 1000 / 500, sumData.Rows[0].ParseDouble("FC-Map [g/km]"), 1e-3); } [TestCase]