Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 43e847d4 authored by Michael KRISPER's avatar Michael KRISPER
Browse files

added test for mod data in 1Hz, corrected bugs

parent 03564443
No related branches found
No related tags found
No related merge requests found
......@@ -34,6 +34,7 @@ using System.ComponentModel;
using System.Data;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Utils;
......@@ -387,6 +388,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
return GetAttribute(field).Caption ?? GetAttribute(field).Name ?? field.ToString();
}
public static string GetShortCaption(this ModalResultField field)
{
var caption = GetCaption(field);
return Regex.Replace(caption, @"\[.*?\]|\<|\>", "").Trim();
}
public static ModalResultFieldAttribute GetAttribute(this ModalResultField field)
{
return (ModalResultFieldAttribute)Attribute.GetCustomAttribute(ForValue(field), typeof(ModalResultFieldAttribute));
......
......@@ -267,6 +267,7 @@ namespace TUGraz.VectoCore.OutputData
public ModalResults Filter(ModalResults data)
{
var absTime = 0.SI<Second>();
var distance = 0.SI<Meter>();
var results = (ModalResults)data.Clone();
var remainingDt = 0.SI<Second>();
......@@ -276,6 +277,8 @@ namespace TUGraz.VectoCore.OutputData
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];
// if current + remaining time >= 1 second: take remaining row and split up currentRow to fill up 1 second.
if (remainingDt > 0 && remainingDt + currentDt >= 1) {
......@@ -285,25 +288,36 @@ namespace TUGraz.VectoCore.OutputData
var gear = row[(int)ModalResultField.Gear];
gearsList[gear] = gearsList.GetValueOrZero(gear) + diffDt;
distance += diffDt * v_act + diffDt * diffDt * (MeterPerSquareSecond)row[(int)ModalResultField.acc] / 2;
v_act += diffDt * (MeterPerSquareSecond)row[(int)ModalResultField.acc];
r.ItemArray = AddRow(remainingRow, MultiplyRow(row.ItemArray, diffDt));
absTime += diffDt;
r[(int)ModalResultField.time] = absTime;
r[(int)ModalResultField.simulationInterval] = 1.SI<Second>();
r[(int)ModalResultField.Gear] = gearsList.MaxBy(kv => kv.Value).Key;
r[(int)ModalResultField.dist] = distance;
gearsList.Clear();
results.Rows.Add(r);
currentDt = VectoMath.Max(remainingDt + currentDt - 1.SI<Second>(), 0.SI<Second>());
currentDt -= diffDt;
remainingDt = 0.SI<Second>();
remainingRow = null;
}
// if current row still longer than 1 second: split it to 1 second slices until it is < 1 second
while (currentDt >= 1) {
currentDt = currentDt - 1.SI<Second>();
var dt = 1.SI<Second>();
var r = results.NewRow();
r.ItemArray = row.ItemArray;
absTime += 1.SI<Second>();
absTime += dt;
distance += dt * v_act + dt * dt * (MeterPerSquareSecond)row[(int)ModalResultField.acc] / 2;
v_act += dt * (MeterPerSquareSecond)row[(int)ModalResultField.acc];
r[(int)ModalResultField.time] = absTime;
r[(int)ModalResultField.simulationInterval] = 1.SI<Second>();
r[(int)ModalResultField.simulationInterval] = dt;
r[(int)ModalResultField.dist] = distance;
results.Rows.Add(r);
}
......@@ -312,6 +326,7 @@ namespace TUGraz.VectoCore.OutputData
var gear = row[(int)ModalResultField.Gear];
gearsList[gear] = gearsList.GetValueOrZero(gear) + currentDt;
distance += currentDt * v_act + currentDt * currentDt * (MeterPerSquareSecond)row[(int)ModalResultField.acc] / 2;
remainingRow = AddRow(remainingRow, MultiplyRow(row.ItemArray, currentDt));
remainingDt += currentDt;
absTime += currentDt;
......@@ -329,6 +344,7 @@ namespace TUGraz.VectoCore.OutputData
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;
results.Rows.Add(r);
}
......@@ -338,12 +354,15 @@ namespace TUGraz.VectoCore.OutputData
private static IEnumerable<object> MultiplyRow(IEnumerable<object> row, SI dt)
{
return row.Select(val => {
val.Switch()
.Case<SI>(si => val = si * dt.Value())
.Case<int>(i => val = i * dt.Value())
.Case<double>(d => val = d * dt.Value())
.Case<float>(f => val = f * dt.Value())
.Case<uint>(ui => val = ui * dt.Value());
if (val is SI)
val = (SI)val * dt.Value();
else {
val.Switch()
.Case<int>(i => val = i * dt.Value())
.Case<double>(d => val = d * dt.Value())
.Case<float>(f => val = f * dt.Value())
.Case<uint>(ui => val = ui * dt.Value());
}
return val;
});
}
......@@ -356,13 +375,20 @@ namespace TUGraz.VectoCore.OutputData
if (addRow == null) {
return row.ToArray();
}
return row.ZipAll(addRow, (val, addVal) => {
val.Switch()
.Case<SI>(si => val = si + (SI)addVal)
.Case<int>(i => val = i + (int)addVal)
.Case<double>(d => val = d + (double)addVal)
.Case<float>(f => val = f + (float)addVal)
.Case<uint>(ui => val = ui + (uint)addVal);
if (val is SI || addVal is SI) {
if (DBNull.Value == val)
val = addVal;
else if (DBNull.Value != addVal)
val = (SI)val + (SI)addVal;
} else {
val.Switch()
.Case<int>(i => val = i + (int)addVal)
.Case<double>(d => val = d + (double)addVal)
.Case<float>(f => val = f + (float)addVal)
.Case<uint>(ui => val = ui + (uint)addVal);
}
return val;
}).ToArray();
}
......
......@@ -29,15 +29,21 @@
* Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
*/
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms.DataVisualization.Charting;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.FileIO.JSON;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.OutputData;
using TUGraz.VectoCore.OutputData.FileIO;
using TUGraz.VectoCore.Tests.Utils;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Tests.Integration
{
......@@ -176,6 +182,82 @@ namespace TUGraz.VectoCore.Tests.Integration
Assert.IsTrue(jobContainer.Runs.All(r => r.Success), string.Concat(jobContainer.Runs.Select(r => r.ExecException)));
}
[TestMethod, TestCategory("LongRunning")]
public void Truck40t_Mod1Hz_Test()
{
var modFileName = "40t_Long_Haul_Truck_RegionalDeliveryFullLoading.vmod";
var modFileName1Hz = "40t_Long_Haul_Truck_RegionalDeliveryFullLoading_1Hz.vmod";
if (File.Exists(modFileName))
File.Delete(modFileName);
if (File.Exists(modFileName1Hz))
File.Delete(modFileName1Hz);
var inputData = JSONInputDataFactory.ReadJsonJob(LongHaulTruckDeclarationJob);
var fileWriter = new FileOutputWriter("Truck40t_Mod1Hz_Test.vecto");
var factory = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
WriteModalResults = true,
ModalResults1Hz = false
};
var factory1Hz = new SimulatorFactory(ExecutionMode.Declaration, inputData, fileWriter) {
WriteModalResults = true,
ModalResults1Hz = true
};
var sumData = new SummaryDataContainer(fileWriter);
var jobContainer = new JobContainer(sumData);
jobContainer.AddRuns(factory);
var i = 5;
jobContainer.Runs[i].Run.Run();
Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors,
string.Format("{0}", jobContainer.Runs[i].ExecException));
jobContainer = new JobContainer(sumData);
jobContainer.AddRuns(factory1Hz);
jobContainer.Runs[i].Run.Run();
Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors,
string.Format("{0}", jobContainer.Runs[i].ExecException));
var modFile = VectoCSVFile.Read(modFileName);
var modFile1Hz = VectoCSVFile.Read(modFileName1Hz);
// test if line count matches the second count
var maxSeconds =
(int)Math.Ceiling(modFile.Rows.Cast<DataRow>().Last().ParseDouble(ModalResultField.time.GetShortCaption()));
var lineCount1Hz = modFile1Hz.Rows.Count;
Assert.IsTrue(lineCount1Hz == maxSeconds);
// test max distance
var maxDistance = modFile.Rows.Cast<DataRow>().Last().ParseDouble(ModalResultField.dist.GetShortCaption());
var maxDistance1Hz = modFile1Hz.Rows.Cast<DataRow>().Last().ParseDouble(ModalResultField.dist.GetShortCaption());
AssertHelper.AreRelativeEqual(maxDistance, maxDistance1Hz);
// test if interval in 1Hz always is 1
Assert.IsTrue(
modFile1Hz.Rows.Cast<DataRow>()
.All(r => r.ParseDouble(ModalResultField.simulationInterval.GetShortCaption()).IsEqual(1)),
"dt must always be 1 second");
// test if absTime in 1Hz always is a whole number and consecutive
Assert.IsTrue(
modFile1Hz.Rows.Cast<DataRow>()
.Select((r, index) => r.ParseDouble(ModalResultField.time.GetName()).IsEqual(index + 1))
.All(p => p), "time must be whole numbers and consecutive");
// test sum of fuel consumption
var sumFuelConsumption = modFile.Rows.Cast<DataRow>().Select(r =>
r.ParseDoubleOrGetDefault(ModalResultField.FCWHTCc.GetShortCaption()) *
r.ParseDouble(ModalResultField.simulationInterval.GetShortCaption())).Sum();
var sumFuelConsumption1Hz =
modFile1Hz.Rows.Cast<DataRow>()
.Select(r => r.ParseDoubleOrGetDefault(ModalResultField.FCWHTCc.GetShortCaption()))
.Sum();
AssertHelper.AreRelativeEqual(sumFuelConsumption, sumFuelConsumption1Hz, "Fuel Consumption is not equal", 1e-5);
}
[TestMethod, TestCategory("LongRunning")]
public void Truck12t_DeclarationTest()
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment