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

Skip to content
Snippets Groups Projects
Commit 9258ad64 authored by Harald Martini's avatar Harald Martini
Browse files

added missing units to mod file

parent 200a62a7
No related branches found
No related tags found
No related merge requests found
......@@ -438,7 +438,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
var entry = BatteryColumns.GetOrAdd(idx, _ => new Dictionary<ModalResultField, DataColumn>());
foreach (var key in BatterySignals) {
entry.GetOrAdd(key, _ => {
var c = Columns.Add($"{key.GetName()}_{idx}", typeof(SI));
var c = Columns.Add($"{key.GetName()}_{idx}",
typeof(SI));
c.Caption = key.GetCaption("_" + idx.ToString());
c.ExtendedProperties[ModalResults.ExtendedPropertyNames.Decimals] = key.GetAttribute().Decimals;
c.ExtendedProperties[ModalResults.ExtendedPropertyNames.OutputFactor] =
key.GetAttribute().OutputFactor;
......
......@@ -32,6 +32,7 @@
using System;
using System.Collections.Concurrent;
using System.Reflection;
using System.Security.Policy;
using System.Text.RegularExpressions;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.Simulation.DataBus;
......@@ -274,6 +275,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
/// [kW] Power demand of Auxiliary with ID xxx. See also Aux Dialog and Driving Cycle.
/// </summary>
[ModalResultField(typeof(SI), caption: "P_aux_{0} [kW]", outputFactor: 1e-3)] P_aux_,
[ModalResultField(typeof(SI), caption: "P_aux_{0}_el [kW]", outputFactor: 1e-3)] P_aux_el_,
/// Bus Aux Data
[ModalResultField(typeof(SI), caption: "P_busAux_ES_HVAC [kW]", outputFactor: 1e-3)] P_busAux_ES_HVAC,
......@@ -451,15 +453,15 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
// -->
[ModalResultField(typeof(SI), caption: "P_REESS_T [kW]", outputFactor: 1e-3)] P_reess_terminal,
[ModalResultField(typeof(SI), caption: "P_REESS_int [kW]", outputFactor: 1e-3)] P_reess_int,
[ModalResultField(typeof(SI), caption: "P_REESS_loss [kW]", outputFactor: 1e-3)] P_reess_loss,
[ModalResultField(typeof(SI), caption: "REESS SOC [%]", outputFactor: 100)] REESSStateOfCharge,
[ModalResultField(typeof(SI), caption: "P_REESS_charge_max [kW]", outputFactor: 1e-3)] P_reess_charge_max,
[ModalResultField(typeof(SI), caption: "P_REESS_discharge_max [kW]", outputFactor: 1e-3)] P_reess_discharge_max,
[ModalResultField(typeof(SI), caption: "U_REESS_terminal [V]")] U_reess_terminal,
[ModalResultField(typeof(SI), caption: "U_0_REESS [V]")] U0_reess,
[ModalResultField(typeof(SI), caption: "I_REESS [A]")] I_reess,
[ModalResultField(typeof(SI), caption: "P_REESS_T [kW]", outputFactor: 1e-3, showUnit: true)] P_reess_terminal,
[ModalResultField(typeof(SI), caption: "P_REESS_int [kW]", outputFactor: 1e-3, showUnit: true)] P_reess_int,
[ModalResultField(typeof(SI), caption: "P_REESS_loss [kW]", outputFactor: 1e-3, showUnit: true)] P_reess_loss,
[ModalResultField(typeof(SI), caption: "REESS SOC [%]", outputFactor: 100, showUnit: true)] REESSStateOfCharge,
[ModalResultField(typeof(SI), caption: "P_REESS_charge_max [kW]", outputFactor: 1e-3, showUnit: true)] P_reess_charge_max,
[ModalResultField(typeof(SI), caption: "P_REESS_discharge_max [kW]", outputFactor: 1e-3, showUnit:true)] P_reess_discharge_max,
[ModalResultField(typeof(SI), caption: "U_REESS_terminal [V]", showUnit:true)] U_reess_terminal,
[ModalResultField(typeof(SI), caption: "U_0_REESS [V]", showUnit:true)] U0_reess,
[ModalResultField(typeof(SI), caption: "I_REESS [A]", showUnit: true)] I_reess,
[ModalResultField(typeof(SI), caption: "T_max_propulsion [Nm]")] MaxPropulsionTorqe,
[ModalResultField(typeof(SI), caption: "P_DC/DC_In [kW]", outputFactor: 1e-3)] P_DCDC_In,
......@@ -500,10 +502,21 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
return GetAttribute(field).Name ?? field.ToString();
}
public static string GetCaption(this ModalResultField field)
public static string GetCaption(this ModalResultField field, string suffix = null)
{
var attribute = GetAttribute(field);
return attribute.Caption ?? attribute.Name ?? field.ToString();
if (suffix != null) {
var captionNoUnit = field.GetShortCaption();
var captionUnit = field.GetCaption();
var captionWithSuffix = captionUnit.Replace(captionNoUnit, captionNoUnit + suffix);
return captionWithSuffix;
} else {
return attribute.Caption ?? attribute.Name ?? field.ToString();
}
}
public static string GetShortCaption(this ModalResultField field)
......@@ -512,6 +525,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
return Regex.Replace(caption, @"\[.*?\]|\<|\>", "").Trim();
}
public static Type GetDataType(this ModalResultField field)
{
return GetAttribute(field).DataType;
......
......@@ -55,9 +55,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
foreach (var auxId in _auxData.Keys) {
var name = $"P_{auxId}_el [kW]";
_auxColumnName.Add(auxId, name); //use column name as ID
VehicleContainer.AddAuxiliary(name, name);
var id = $"{auxId}_el";
_auxColumnName.Add(auxId, id); //use column name as ID
VehicleContainer.AddAuxiliary(id);
}
......
......@@ -564,9 +564,11 @@ namespace TUGraz.VectoCore.OutputData
SumDataFields.AXLE_RATIO
});
cols.AddRange(new[] {
Constants.Auxiliaries.IDs.SteeringPump, Constants.Auxiliaries.IDs.Fan,
Constants.Auxiliaries.IDs.SteeringPump,
Constants.Auxiliaries.IDs.Fan,
Constants.Auxiliaries.IDs.HeatingVentilationAirCondition,
Constants.Auxiliaries.IDs.PneumaticSystem, Constants.Auxiliaries.IDs.ElectricSystem
Constants.Auxiliaries.IDs.PneumaticSystem,
Constants.Auxiliaries.IDs.ElectricSystem
}.Select(x => string.Format(SumDataFields.AUX_TECH_FORMAT, x)));
cols.AddRange(new[] {
......
......@@ -2,13 +2,19 @@
//#define singlethreaded
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Data;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Ninject;
using NUnit.Framework;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Configuration;
using TUGraz.VectoCore.InputData.FileIO.XML;
using TUGraz.VectoCore.InputData.FileIO.XML.Declaration;
......@@ -20,6 +26,8 @@ using TUGraz.VectoCore.Models.Simulation.Impl.SimulatorFactory;
using TUGraz.VectoCore.OutputData;
using TUGraz.VectoCore.OutputData.FileIO;
using TUGraz.VectoCore.Tests.Models.Simulation;
using TUGraz.VectoCore.Tests.Utils;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Tests.Integration.Declaration.HeavyLorry;
......@@ -33,8 +41,8 @@ public class HeavyLorrySimulation
private const string BASE_DIR = @"TestData\Integration\DeclarationMode\V24_DeclarationMode\";
private const string HeavylorryGroup2HevS2XML = @"HeavyLorry\Group2_HEV_S2.xml";
private const string HeavylorryGroup2HevS4XML = @"HeavyLorry\Group2_HEV_S4.xml";
private const string HeavylorryGroup2HevS2XML = @"HeavyLorry\S-HEV\Group2_HEV_S2.xml";
private const string HeavylorryGroup2HevS4XML = @"HeavyLorry\S-HEV\Group2_HEV_S4.xml";
private StandardKernel _kernel;
private IXMLInputDataReader _xmlReader;
......@@ -100,6 +108,75 @@ public class HeavyLorrySimulation
}
[TestCase(@"HeavyLorry\S-HEV\Group2_HEV_S2_ovc.xml")]
public void VMOD_VSUMUnitTest(string jobFile)
{
var columnsWithoutUnit = new List<ModalResultField> {
ModalResultField.ICEOn,
ModalResultField.EM_Off_,
ModalResultField.HybridStrategyScore,
ModalResultField.HybridStrategySolution,
}.Select(m => m.GetCaption());
// .ToHashSet();
var filePath = Path.Combine(BASE_DIR, jobFile);
SummaryDataContainer sumDataContainer;
var jobContainer = GetJobContainer(jobFile, null, out var fileWriter, out var runs, out sumDataContainer);
var run = runs.First();
jobContainer.AddRun(run);
//run.GetContainer().ModalData.Finish(runStatus:VectoRun.Status.Success, null);
run.GetContainer().FinishSingleSimulationRun(null);
var modFileName = fileWriter.GetModDataFileName(run.RunName, run.CycleName, run.RunSuffix);
var sumFileName = fileWriter.SumFileName;
Assert.IsTrue(File.Exists(modFileName));
var mod = VectoCSVFile.Read(modFileName, false, true);
var columnsWithoutUnitHashSet = new HashSet<string>();
foreach (var col in columnsWithoutUnit) {
var emPositions = run.GetContainer().PowertrainInfo.ElectricMotorPositions;
foreach (var emPosition in emPositions) {
columnsWithoutUnitHashSet.Add(string.Format(col, emPosition.GetLabel()));
}
}
List<string> columnHeaders = new List<string>();
foreach (DataColumn modColumn in mod.Columns) {
columnHeaders.Add(modColumn.Caption);
}
var unitColumnHeaders = columnHeaders.Where(h => !columnsWithoutUnitHashSet.Contains(h));
foreach (string header in unitColumnHeaders) {
TestContext.WriteLine(header);
}
foreach (string header in unitColumnHeaders) {
var regex = new Regex(@"\[\S+\]");
Assert.AreEqual(1, regex.Matches(header).Count(), $"missing unit {header}");
}
var sumCols = new List<string>();
TestContext.WriteLine("\n -----------------------SumFile captions----------------------------- \n");
foreach (DataColumn col in sumDataContainer.Table.Columns) {
var caption = col.Caption;
sumCols.Add(caption);
TestContext.WriteLine(caption);
}
foreach (string sumHeader in sumCols)
{
var regex = new Regex(@"\[\S+\]");
Assert.IsTrue(regex.Matches(sumHeader).Count() <= 1, $"double units {sumHeader}");
}
}
[Test]
public void HEVS4()
{
......@@ -127,55 +204,127 @@ public class HeavyLorrySimulation
//Assume.That(ps.PowerDemandMech != ps.PowerDemandElectric * DeclarationData.AlternatorEfficiency);
Assert.That(ps.ConnectToREESS);
}
[TestCase(@"HeavyLorry\S-HEV\Group2_HEV_S4_invalid_pto.xml")]
public void PTOWithoutTransmissionTest(string jobFile)
{
SummaryDataContainer sumDataContainer;
var exception = Assert.Throws<VectoException>(() => GetJobContainer(jobFile, null, out var fileWriter, out var runs, out sumDataContainer));
TestContext.WriteLine(exception.Message);
}
[TestCase(@"HeavyLorry\S-HEV\Group2_HEV_S2_ovc.xml", 12)]
[TestCase(@"HeavyLorry\S-HEV\Group2_HEV_S3_ovc.xml", 12)]
public void HEV_ChargeDepleting(string jobFile, int nrRuns)
{
SummaryDataContainer sumDataContainer;
var jobContainer = GetJobContainer(jobFile, nrRuns, out var fileWriter, out var runs, out sumDataContainer);
Assert.AreEqual(runs.Count(r => r.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.ChargeDepleting),
runs.Count(r => r.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.ChargeSustaining));
Assert.AreEqual(0, runs.Count(r => r.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.NotApplicable));
[TestCase(@"HeavyLorry\HEV_heavy_lorry_S4_ovc.xml", 12)]
[TestCase(HeavylorryGroup2HevS2XML, 6)]
[TestCase(@"HeavyLorry\Group5_HEV_P3_ovc.xml", 20)]
public void OVCHevSimulationSingleRun(string jobFile, int nrRuns)
{
var filePath = Path.Combine(BASE_DIR, jobFile);
var dataProvider = _xmlReader.CreateDeclaration(filePath);
var fileWriter = new FileOutputWriter(filePath);
var runsFactory = SimulatorFactory.CreateSimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter);
runsFactory.WriteModalResults = true;
var sumWriter = new MockSumWriter();
var jobContainer = new JobContainer(sumWriter);
runsFactory.SumData = sumWriter;
var runs = runsFactory.SimulationRuns().ToList();
Assert.AreEqual(nrRuns, runs.Count);
runs = runs.Where(run => {
var rd = run.GetContainer().RunData;
return rd.OVCMode == VectoRunData.OvcHevMode.ChargeDepleting &&
rd.Mission.MissionType == MissionType.UrbanDelivery && rd.Loading == LoadingType.ReferenceLoad;
}).ToList();
jobContainer.AddRun(runs.Single());
jobContainer.AddRun(runs.First(r => r.GetContainer().RunData.BatteryData.Batteries.Any(tuple => !tuple.Item2.ChargeSustainingBattery)));
Assert.AreEqual(1, jobContainer.Runs.Count);
jobContainer.Execute(false);
jobContainer.WaitFinished();
Assert.IsTrue(jobContainer.AllCompleted);
Assert.IsTrue(jobContainer.Runs.TrueForAll(runEntry => runEntry.Success));
PrintRuns(jobContainer, fileWriter);
PrintFiles(fileWriter);
var modData = ((ModalDataContainer)((VehicleContainer)runs.Single().GetContainer()).ModData).Data;
jobContainer.Execute(false);
WaitAndAssertSuccess(jobContainer, fileWriter);
var soc = modData.Rows[0].Field<Scalar>(ModalResultField.REESSStateOfCharge.GetName());
foreach (DataRow modDataRow in modData.Rows) {
Assert.AreEqual(soc, modDataRow.Field<Scalar>(ModalResultField.REESSStateOfCharge.GetName()));
Assert.IsFalse(modDataRow.Field<bool>(ModalResultField.ICEOn.GetName()));
}
Assert.IsTrue(modData.Rows.Count > 0);
}
[TestCase(@"HeavyLorry\S-HEV\Group2_HEV_S2_pto_transmission.xml", 6)]
public void SHEV_PTO_Transmission(string jobFile, int nrRuns)
{
SummaryDataContainer sumDataContainer;
var jobContainer = GetJobContainer(jobFile, nrRuns, out var fileWriter, out var runs, out sumDataContainer);
Assert.AreEqual(0, runs.Count(r => r.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.NotApplicable));
Assert.AreEqual(6, runs.Count(r => r.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.ChargeSustaining));
Assert.AreEqual(0, runs.Count(r => r.GetContainer().RunData.OVCMode == VectoRunData.OvcHevMode.ChargeDepleting));
runs = runs.Where(run => {
var rd = run.GetContainer().RunData;
return rd.Mission.MissionType == MissionType.LongHaul && rd.Loading == LoadingType.ReferenceLoad;
}).ToList();
jobContainer.AddRun(runs.Single());
Assert.AreEqual(1, jobContainer.Runs.Count);
var modDataContainer = ((ModalDataContainer)((VehicleContainer)runs.Single().GetContainer()).ModData);
var modData = modDataContainer.Data;
var aux = modDataContainer.Auxiliaries.ToDictionary(entry => entry.Key, entry => entry.Value);
jobContainer.Execute(false);
WaitAndAssertSuccess(jobContainer, fileWriter);
modDataContainer.Data = modData;
modDataContainer.Auxiliaries = aux;
//modDataContainer.GetValues<double>(ModalResultField
var soc = modData.Rows[0].Field<Scalar>(ModalResultField.REESSStateOfCharge.GetName());
var ptoTransm = modDataContainer[Constants.Auxiliaries.IDs.PTOTransmission];
Assert.IsNotNull(ptoTransm);
//modData.
foreach (DataRow modDataRow in modData.Rows)
{
}
Assert.IsTrue(modData.Rows.Count > 0);
}
[TestCase(@"HeavyLorry\S-HEV")]
private void WaitAndAssertSuccess(JobContainer jobContainer, FileOutputWriter fileWriter)
{
jobContainer.WaitFinished();
Assert.IsTrue(jobContainer.AllCompleted);
Assert.IsTrue(jobContainer.Runs.TrueForAll(runEntry => runEntry.Success));
PrintRuns(jobContainer, fileWriter);
PrintFiles(fileWriter);
}
private JobContainer GetJobContainer(string jobFile, int? nrRuns, out FileOutputWriter fileWriter,
out List<IVectoRun> runs, out SummaryDataContainer sumDataContainer)
{
var filePath = Path.Combine(BASE_DIR, jobFile);
var dataProvider = _xmlReader.CreateDeclaration(filePath);
fileWriter = new FileOutputWriter(filePath);
var runsFactory = SimulatorFactory.CreateSimulatorFactory(ExecutionMode.Declaration, dataProvider, fileWriter);
runsFactory.WriteModalResults = true;
var sumWriter = new MockSumWriter();
var jobContainer = new JobContainer(sumWriter);
runsFactory.SumData = sumWriter;
sumDataContainer = sumWriter;
runs = runsFactory.SimulationRuns().ToList();
if (nrRuns.HasValue) {
Assert.AreEqual(nrRuns, runs.Count);
}
return jobContainer;
}
private void PrintRuns(JobContainer jobContainer, FileOutputWriter fileWriter = null)
......
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