diff --git a/VECTO/GUI/F_MAINForm.vb b/VECTO/GUI/F_MAINForm.vb index fd3cb1091f760e5eb044e9c6c7322e88cc028ade..98e7a7f43aaa9c2096dffde4ab75811249e8e711 100644 --- a/VECTO/GUI/F_MAINForm.vb +++ b/VECTO/GUI/F_MAINForm.vb @@ -1555,12 +1555,12 @@ Imports System.Text Dim sumWriter As SummaryFileWriter = New SummaryFileWriter(sumFileName) Dim jobContainer As JobContainer = New JobContainer(sumWriter) - Dim mode As SimulatorFactory.FactoryMode + Dim mode As ExecutionMode If Cfg.DeclMode Then - mode = SimulatorFactory.FactoryMode.DeclarationMode + mode = ExecutionMode.Declaration Else - mode = SimulatorFactory.FactoryMode.EngineeringMode + mode = ExecutionMode.Engineering End If Dim doneProcesses As List(Of String) = New List(Of String) diff --git a/VectoConsole/Program.cs b/VectoConsole/Program.cs index 4aebaf9c7c89c3873816a90e447fa4819b6b3062..f57b2aca732a8693bcc8ecce04b6016d0e211bef 100644 --- a/VectoConsole/Program.cs +++ b/VectoConsole/Program.cs @@ -20,7 +20,6 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.Remoting.Channels; using System.Threading; using NLog; using NLog.Config; @@ -129,9 +128,9 @@ Examples: var sumWriter = new SummaryFileWriter(sumFileName); jobContainer = new JobContainer(sumWriter); - var mode = SimulatorFactory.FactoryMode.DeclarationMode; + var mode = ExecutionMode.Declaration; if (args.Contains("-eng")) { - mode = SimulatorFactory.FactoryMode.EngineeringMode; + mode = ExecutionMode.Engineering; Console.ForegroundColor = ConsoleColor.White; Console.WriteLine( "Switching to Engineering Mode. Make sure the job-file is saved in engineering mode!"); diff --git a/VectoCore/Models/Simulation/Data/ModalDataWriter.cs b/VectoCore/Models/Simulation/Data/ModalDataWriter.cs index 7c5bef2458a04d1b0c683fe84a3ae3194d87495a..88e8d97be910d2d6d9b433edc5530e72aced0b56 100644 --- a/VectoCore/Models/Simulation/Data/ModalDataWriter.cs +++ b/VectoCore/Models/Simulation/Data/ModalDataWriter.cs @@ -25,7 +25,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data { public class ModalDataWriter : IModalDataWriter { - private readonly SimulatorFactory.FactoryMode _mode; + private readonly ExecutionMode _mode; private readonly Action<ModalDataWriter> _addReportResult; private ModalResults Data { get; set; } private DataRow CurrentRow { get; set; } @@ -36,10 +36,10 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public VectoRun.Status RunStatus { get; protected set; } public ModalDataWriter(string modFileName, - SimulatorFactory.FactoryMode mode = SimulatorFactory.FactoryMode.EngineeringMode) : this(modFileName, _ => {}, mode) {} + ExecutionMode mode = ExecutionMode.Engineering) : this(modFileName, _ => {}, mode) {} public ModalDataWriter(string modFileName, Action<ModalDataWriter> addReportResult, - SimulatorFactory.FactoryMode mode = SimulatorFactory.FactoryMode.EngineeringMode) + ExecutionMode mode = ExecutionMode.Engineering) { HasTorqueConverter = false; ModFileName = modFileName; @@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data RunStatus = runStatus; - if (_mode != SimulatorFactory.FactoryMode.EngineOnlyMode) { + if (_mode != ExecutionMode.EngineOnly) { dataColumns.AddRange(new[] { ModalResultField.simulationInterval, ModalResultField.dist, @@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ModalResultField.Paux }); - if (_mode != SimulatorFactory.FactoryMode.EngineOnlyMode) { + if (_mode != ExecutionMode.EngineOnly) { dataColumns.AddRange(new[] { ModalResultField.Gear, ModalResultField.PlossGB, @@ -118,11 +118,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Data .Concat((Auxiliaries.Values.Select(c => c.ColumnName))) .Concat(new[] { ModalResultField.FCMap, ModalResultField.FCAUXc, ModalResultField.FCWHTCc }.Select(x => x.GetName())); - if (_mode != SimulatorFactory.FactoryMode.DeclarationMode || WriteModalResults) { + if (_mode != ExecutionMode.Declaration || WriteModalResults) { VectoCSVFile.Write(ModFileName, new DataView(Data).ToTable(false, strCols.ToArray())); } - if (_mode == SimulatorFactory.FactoryMode.DeclarationMode) { + if (_mode == ExecutionMode.Declaration) { _addReportResult(this); } } diff --git a/VectoCore/Models/Simulation/DataBus/IDataBus.cs b/VectoCore/Models/Simulation/DataBus/IDataBus.cs index b012afa72bff5f364d1db688adf612131a1b932f..60850eb1eaf16d2a8eb8a7ff13ea205e200386aa 100644 --- a/VectoCore/Models/Simulation/DataBus/IDataBus.cs +++ b/VectoCore/Models/Simulation/DataBus/IDataBus.cs @@ -14,8 +14,8 @@ * limitations under the Licence. */ +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent; -using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Simulation.DataBus { @@ -23,5 +23,8 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus /// Defines interfaces for all different cockpits to access shared data of the powertrain. /// </summary> public interface IDataBus : IGearboxInfo, IEngineInfo, IVehicleInfo, IMileageCounter, IClutchInfo, IBrakes, - IRoadLookAhead, IDriverInfo {} + IRoadLookAhead, IDriverInfo + { + ExecutionMode ExecutionMode { get; set; } + } } \ No newline at end of file diff --git a/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs index 212144642a433f7f74087f0e9214da221661127a..a6a28b60492231d1e3678682ab484c1d83dee121 100644 --- a/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs +++ b/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs @@ -28,32 +28,32 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Simulation.Impl { + public enum ExecutionMode + { + Engineering, + Declaration, + EngineOnly, + } + public class SimulatorFactory : LoggingObject { private static int _jobNumberCounter; - public enum FactoryMode - { - EngineeringMode, - DeclarationMode, - EngineOnlyMode, - }; - - private FactoryMode _mode; + private readonly ExecutionMode _mode; - public SimulatorFactory(FactoryMode mode, string jobFile) + public SimulatorFactory(ExecutionMode mode, string jobFile) { Log.Fatal("########## VectoCore Version {0} ##########", Assembly.GetExecutingAssembly().GetName().Version); JobNumber = Interlocked.Increment(ref _jobNumberCounter); _mode = mode; switch (mode) { - case FactoryMode.DeclarationMode: + case ExecutionMode.Declaration: DataReader = new DeclarationModeSimulationDataReader(); break; - case FactoryMode.EngineeringMode: + case ExecutionMode.Engineering: DataReader = new EngineeringModeSimulationDataReader(); break; - case FactoryMode.EngineOnlyMode: + case ExecutionMode.EngineOnly: DataReader = new EngineOnlySimulationDataReader(); break; default: @@ -62,7 +62,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl DataReader.SetJobFile(jobFile); } - public ISimulationDataReader DataReader { get; private set; } + public ISimulationDataReader DataReader { get; } public SummaryFileWriter SumWriter { get; set; } diff --git a/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index a5fe6a442f06e6ef30ca8737dc637b82cefee43a..31ec72675520e73c67b8a3d93e1210a252edd1bc 100644 --- a/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -150,10 +150,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl #endregion - public VehicleContainer(IModalDataWriter dataWriter = null, WriteSumData writeSumData = null) + public VehicleContainer(IModalDataWriter dataWriter = null, WriteSumData writeSumData = null, + ExecutionMode executionMode = ExecutionMode.Declaration) { DataWriter = dataWriter; WriteSumData = writeSumData ?? delegate {}; + ExecutionMode = executionMode; } #region IVehicleContainer @@ -296,5 +298,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl { get { return Road == null ? 0.SI<Meter>() : Road.CycleStartDistance; } } + + public ExecutionMode ExecutionMode { get; set; } } } \ No newline at end of file diff --git a/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs b/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs index 81c55a421e4f8ea03c400dec81b973398dba029e..e3ab0d5710cb6ea6ea3155a3050dd0cb3ed00f0d 100644 --- a/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs +++ b/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs @@ -45,6 +45,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox private readonly PerSecond _maxSpeed = double.NegativeInfinity.SI<PerSecond>(); private readonly PerSecond _minSpeed = double.PositiveInfinity.SI<PerSecond>(); + /// <summary> + /// True if the last access to GetInTorque was an extrapolation. + /// </summary> + public bool Extrapolated + { + get { return _lossMap.Extrapolated; } + } public string GearName { get; protected set; } @@ -145,20 +152,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox /// <returns>Torque needed at input side (towards the engine).</returns> public NewtonMeter GetInTorque(PerSecond inAngularVelocity, NewtonMeter outTorque) { - try { - var inTorque = _lossMap.Interpolate(inAngularVelocity.Value(), outTorque.Value()).SI<NewtonMeter>(); - Log.Debug("GearboxLoss {0}: {1}", GearName, inTorque - outTorque); - - // todo (MK, 2015-12-07): extrapolate? + var inTorque = _lossMap.Interpolate(inAngularVelocity.Value(), outTorque.Value(), true).SI<NewtonMeter>(); - // Limit input torque to a maximum value without losses (just torque/ratio) - return VectoMath.Max(inTorque, outTorque / _ratio); - } catch (VectoException) { - Log.Error("{0} - Failed to interpolate in TransmissionLossMap. angularVelocity: {1}, torque: {2}", GearName, - inAngularVelocity, outTorque); + // Limit input torque to a maximum value without losses (just torque/ratio) + inTorque = VectoMath.Max(inTorque, outTorque / _ratio); - return outTorque / _ratio; - } + Log.Debug("GearboxLoss {0}: {1}, inAngularVelocity: {2}, outTorque: {3}", GearName, inTorque - outTorque, + inAngularVelocity, outTorque); + return inTorque; } /// <summary> diff --git a/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs b/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs index afc1ab8c0c930f151641e82fb7aa2c5eb729f8a8..adbea03ff4114bbb5c761f93830bc801a472c569 100644 --- a/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs +++ b/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs @@ -14,6 +14,7 @@ * limitations under the Licence. */ +using TUGraz.VectoCore.Exceptions; using TUGraz.VectoCore.Models.Connector.Ports; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; @@ -82,8 +83,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void DoCommitSimulationStep() { + if (_gearData.LossMap.Extrapolated) { + // todo (MK, 2015-12-14): should we throw an interpolation error in EngineOnly Mode also? + if (DataBus.ExecutionMode == ExecutionMode.Declaration) { + throw new VectoException("AxleGear LossMap data was extrapolated: range for loss map is not sufficient."); + } else { + Log.Warn("AxleGear LossMap data was extrapolated."); + } + } Loss = null; - // nothing to commit } } } \ No newline at end of file diff --git a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index 35ae89a43c8aaa2f8f026c28e896e03bb522c0b2..b230e1343350ca4d8204db09cdcc43d1534a127f 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -22,6 +22,7 @@ using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.Simulation; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.DataBus; +using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Utils; @@ -383,6 +384,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void DoCommitSimulationStep() { + if (!_disengaged) { + if (Data.Gears[Gear].LossMap.Extrapolated) { + // todo (MK, 2015-12-14): should we throw an interpolation error in EngineOnly Mode also? + if (DataBus.ExecutionMode == ExecutionMode.Declaration) { + throw new VectoException("Gear {0} LossMap data was extrapolated: range for loss map is not sufficient.", Gear); + } else { + Log.Warn("Gear {0} LossMap data was extrapolated: range for loss map is not sufficient.", Gear); + } + } + } + _powerLoss = null; _powerLossInertia = null; } diff --git a/VectoCore/Utils/DelauneyMap.cs b/VectoCore/Utils/DelauneyMap.cs index 1dbd4624b61a0b199e345f3d34679c826eb90a01..e8b7186c986a8a2c44eff2192c86a40a8183cc33 100644 --- a/VectoCore/Utils/DelauneyMap.cs +++ b/VectoCore/Utils/DelauneyMap.cs @@ -70,21 +70,30 @@ namespace TUGraz.VectoCore.Utils _triangles = triangles.FindAll(t => !t.SharesVertexWith(superTriangle)); } - public double Interpolate(double x, double y) + public double Interpolate(double x, double y, bool allowExtrapolation = false) { - var tr = _triangles.Find(triangle => triangle.IsInside(x, y, exact: true)); - if (tr == null) { - Log.Info("Exact search found no fitting triangle. Approximation will be used."); - tr = _triangles.Find(triangle => triangle.IsInside(x, y, exact: false)); - if (tr == null) { - throw new VectoException("Interpolation failed. x: {0}, y: {1}", x, y); - } + var tr = _triangles.Find(triangle => triangle.IsInside(x, y, exact: true)) ?? + _triangles.Find(triangle => triangle.IsInside(x, y, exact: false)); + + if (tr != null) { + Extrapolated = false; + var plane = new Plane(tr); + return (plane.W - plane.X * x - plane.Y * y) / plane.Z; + } + + if (!allowExtrapolation) { + throw new VectoException("Interpolation failed. x: {0}, y: {1}", x, y); } - var plane = new Plane(tr); - return (plane.W - plane.X * x - plane.Y * y) / plane.Z; + // todo: extrapolate + Extrapolated = true; + + + return y; } + public bool Extrapolated { get; set; } + public DelauneyMap CreateInvertedMap() { var reverted = new DelauneyMap(); diff --git a/VectoCore/Utils/VectoMath.cs b/VectoCore/Utils/VectoMath.cs index 56e72de52e0029cee02f920beb2371fb74495f05..bb643114899d1e05efa543e8f336b295981d4701 100644 --- a/VectoCore/Utils/VectoMath.cs +++ b/VectoCore/Utils/VectoMath.cs @@ -232,9 +232,15 @@ namespace TUGraz.VectoCore.Utils P3 = p3; } + /// <summary> + /// Barycentric Technique: http://www.blackpawn.com/texts/pointinpoly/default.html + /// </summary> + /// <param name="x"></param> + /// <param name="y"></param> + /// <param name="exact"></param> + /// <returns></returns> public bool IsInside(double x, double y, bool exact) { - //Barycentric Technique: http://www.blackpawn.com/texts/pointinpoly/default.html var v0X = P3.X - P1.X; var v0Y = P3.Y - P1.Y; var v1X = P2.X - P1.X; diff --git a/VectoCoreTest/Integration/DeclarationReportTest.cs b/VectoCoreTest/Integration/DeclarationReportTest.cs index f13988905e3f26843a887b7ef5830630d523b875..d515658dcd55dbcc006a57855f10798f11a2f0b0 100644 --- a/VectoCoreTest/Integration/DeclarationReportTest.cs +++ b/VectoCoreTest/Integration/DeclarationReportTest.cs @@ -38,7 +38,7 @@ namespace TUGraz.VectoCore.Tests.Integration var sumWriter = new SummaryFileWriter(@"job-report.vsum"); var jobContainer = new JobContainer(sumWriter); - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.DeclarationMode, @"TestData\Jobs\job-report.vecto"); + var factory = new SimulatorFactory(ExecutionMode.Declaration, @"TestData\Jobs\job-report.vecto"); jobContainer.AddRuns(factory); jobContainer.Execute(); diff --git a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs index cd26e4ce82c119758f25dec81b6db179689685d4..a6359ad725c0b45208adeafd6fd28c6210b996e7 100644 --- a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs +++ b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs @@ -14,9 +14,7 @@ * limitations under the Licence. */ -using System.Data; using System.IO; -using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using TUGraz.VectoCore.FileIO.Reader; using TUGraz.VectoCore.FileIO.Reader.Impl; @@ -61,7 +59,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle var dt = 1.SI<Second>(); var modFile = Path.GetRandomFileName() + ".vmod"; - var dataWriter = new ModalDataWriter(modFile, SimulatorFactory.FactoryMode.EngineOnlyMode); + var dataWriter = new ModalDataWriter(modFile, ExecutionMode.EngineOnly); foreach (var cycleEntry in data.Entries) { var response = port.Request(absTime, dt, cycleEntry.EngineTorque, cycleEntry.EngineSpeed); diff --git a/VectoCoreTest/Integration/FullCycleDeclarationTest.cs b/VectoCoreTest/Integration/FullCycleDeclarationTest.cs index 9544f12171c658c9ef0b4e32de7c3a4826c257dd..cda51e3e839aade55c6d9545cb577d3bd71832d0 100644 --- a/VectoCoreTest/Integration/FullCycleDeclarationTest.cs +++ b/VectoCoreTest/Integration/FullCycleDeclarationTest.cs @@ -33,7 +33,7 @@ namespace TUGraz.VectoCore.Tests.Integration public class FullCycleDeclarationTest { public const string TruckDeclarationJob = - @"TestData\Integration\DeclarationMode\40t Truck\40t_Long_Haul_Truck.vecto"; + @"TestData\Integration\Declaration\40t Truck\40t_Long_Haul_Truck.vecto"; [TestMethod] @@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.Tests.Integration { LogManager.DisableLogging(); - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.DeclarationMode, TruckDeclarationJob); + var factory = new SimulatorFactory(ExecutionMode.Declaration, TruckDeclarationJob); factory.WriteModalResults = true; var sumFileName = Path.GetFileNameWithoutExtension(TruckDeclarationJob) + Constants.FileExtensions.SumFile; var sumWriter = new SummaryFileWriter(sumFileName); @@ -159,7 +159,7 @@ namespace TUGraz.VectoCore.Tests.Integration [TestMethod, Ignore] public void Truck40t_RegionalDeliveryCycle_RefLoad_Declaration() { - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.DeclarationMode, + var factory = new SimulatorFactory(ExecutionMode.Declaration, @"c:\Users\Technik\Downloads\40t Long Haul Truck\40t_Long_Haul_Truck.vecto"); factory.WriteModalResults = true; factory.SumWriter = new SummaryFileWriter("Test.vsum"); @@ -175,7 +175,7 @@ namespace TUGraz.VectoCore.Tests.Integration public void Truck12t_LongHaulCycle_RefLoad_Declaration() { // TODO: fails due to interpolaion failure in Gear 4 - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.DeclarationMode, + var factory = new SimulatorFactory(ExecutionMode.Declaration, @"c:\Users\Technik\Downloads\12t Delivery Truck\12t Delivery Truck.vecto") { WriteModalResults = true, SumWriter = new SummaryFileWriter("Test.vsum") @@ -192,7 +192,7 @@ namespace TUGraz.VectoCore.Tests.Integration public void Truck12t_UrbanDeliveryCycle_RefLoad_Declaration() { // TODO: fails due to interpolaion failure in Gear 4 - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.DeclarationMode, + var factory = new SimulatorFactory(ExecutionMode.Declaration, @"c:\Users\Technik\Downloads\12t Delivery Truck\12t Delivery Truck.vecto") { WriteModalResults = true, SumWriter = new SummaryFileWriter("Test.vsum") diff --git a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs index 9025fae8f5188f42f918a2c02df717810672028d..0add9b27262c6e4422ad9d5ce0e1722d91599009 100644 --- a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs +++ b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs @@ -260,7 +260,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns var sumWriter = new SummaryFileWriter(@"job.vsum"); var jobContainer = new JobContainer(sumWriter); - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.EngineeringMode, @"TestData\job.vecto"); + var factory = new SimulatorFactory(ExecutionMode.Engineering, @"TestData\job.vecto"); jobContainer.AddRuns(factory); jobContainer.Execute(); diff --git a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs index 173aa9d64bb0087a5bd89eb98516ec69dda84d3d..7d6e073f2f31ed6176e5fb5969458fa3f0a0df88 100644 --- a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs +++ b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright 2015 European Union * * Licensed under the EUPL (the "Licence"); @@ -142,7 +142,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns response = cyclePort.Request(absTime, ds); response.Switch(). Case<ResponseDrivingCycleDistanceExceeded>(r => ds = r.MaxDistance). - Case<ResponseCycleFinished>(r => { }). + Case<ResponseCycleFinished>(r => {}). Case<ResponseSuccess>(r => { vehicleContainer.CommitSimulationStep(absTime, r.SimulationInterval); absTime += r.SimulationInterval; @@ -176,8 +176,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns var driverData = CreateDriverData(AccelerationFile2); - var modalWriter = new ModalDataWriter("Coach_MinimalPowertrainOverload.vmod", - SimulatorFactory.FactoryMode.EngineeringMode); + var modalWriter = new ModalDataWriter("Coach_MinimalPowertrainOverload.vmod", ExecutionMode.Engineering); var vehicleContainer = new VehicleContainer(modalWriter); var cycle = new DistanceBasedDrivingCycle(vehicleContainer, cycleData); diff --git a/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCoreTest/Models/Simulation/AuxTests.cs index bfa5c511e4e5106581d2920544003a61b105ec19..3d2ff309510f7c3f90e05345cf8256a4b8c0054e 100644 --- a/VectoCoreTest/Models/Simulation/AuxTests.cs +++ b/VectoCoreTest/Models/Simulation/AuxTests.cs @@ -27,313 +27,313 @@ using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.Tests.Models.Simulation { - [TestClass] - public class AuxTests - { - [TestMethod] - public void AuxWriteModFileSumFile() - { - var dataWriter = new ModalDataWriter(@"AuxWriteModFileSumFile.vmod"); - dataWriter.AddAuxiliary("FAN"); - dataWriter.AddAuxiliary("PS"); - dataWriter.AddAuxiliary("STP"); - dataWriter.AddAuxiliary("ES"); - dataWriter.AddAuxiliary("AC"); - - var sumWriter = new SummaryFileWriter(@"AuxWriteModFileSumFile.vsum"); - var container = new VehicleContainer(dataWriter, - (writer, mass, loading) => sumWriter.WriteFullPowertrain(dataWriter, "", "", "", null, null)); - var data = DrivingCycleDataReader.ReadFromFileDistanceBased(@"TestData\Cycles\LongHaul_short.vdri"); - var mockcycle = new MockDrivingCycle(container, data); - var port = new MockTnOutPort(); - - var aux = new Auxiliary(container); - aux.InPort().Connect(port); - - var hdvClass = VehicleClass.Class5; - var mission = MissionType.LongHaul; - - aux.AddConstant("FAN", - DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump")); - aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, hdvClass)); - aux.AddConstant("STP", - DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass, "Variable displacement")); - aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission, null)); - aux.AddConstant("AC", - DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hdvClass)); - - var speed = 1400.RPMtoRad(); - var torque = 500.SI<NewtonMeter>(); - var t = 0.SI<Second>(); - var dt = 1.SI<Second>(); - - for (var i = 0; i < 11; i++) { - aux.OutPort().Request(t, dt, torque, speed); - dataWriter[ModalResultField.dist] = i.SI<Meter>(); - dataWriter[ModalResultField.Pe_eng] = 0.SI<Watt>(); - dataWriter[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); - container.CommitSimulationStep(t, dt); - t += dt; - } - - container.FinishSimulation(); - sumWriter.Finish(); - - //todo: add aux columns to test - var testColumns = new[] { "Paux_FAN", "Paux_STP", "Paux_AC", "Paux_ES", "Paux_PS", "Paux" }; - - ResultFileHelper.TestModFile( - @"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod", - @"AuxWriteModFileSumFile.vmod", testColumns, testRowCount: false); - ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck.vsum", - @"AuxWriteModFileSumFile.vsum"); - } - - [TestMethod] - public void AuxConstant() - { - var dataWriter = new MockModalDataWriter(); - var container = new VehicleContainer(dataWriter); - var port = new MockTnOutPort(); - var aux = new Auxiliary(container); - aux.InPort().Connect(port); - - var constPower = 1200.SI<Watt>(); - aux.AddConstant("CONSTANT", constPower); - - var speed = 2358.RPMtoRad(); - var torque = 500.SI<NewtonMeter>(); - var t = 0.SI<Second>(); - aux.OutPort().Request(t, t, torque, speed); - Assert.AreEqual(speed, port.AngularVelocity); - var newTorque = torque + constPower / speed; - AssertHelper.AreRelativeEqual(port.Torque, newTorque); - - speed = 2358.RPMtoRad(); - torque = 1500.SI<NewtonMeter>(); - aux.OutPort().Request(t, t, torque, speed); - Assert.AreEqual(speed, port.AngularVelocity); - newTorque = torque + constPower / speed; - AssertHelper.AreRelativeEqual(port.Torque, newTorque); - - speed = 1500.RPMtoRad(); - torque = 1500.SI<NewtonMeter>(); - aux.OutPort().Request(t, t, torque, speed); - Assert.AreEqual(speed, port.AngularVelocity); - newTorque = torque + constPower / speed; - AssertHelper.AreRelativeEqual(port.Torque, newTorque); - } - - [TestMethod] - public void AuxDirect() - { - var dataWriter = new MockModalDataWriter(); - var container = new VehicleContainer(dataWriter); - var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); - var cycle = new MockDrivingCycle(container, data); - var port = new MockTnOutPort(); - var aux = new Auxiliary(container); - aux.InPort().Connect(port); - - aux.AddDirect(cycle); - - var speed = 2358.RPMtoRad(); - var torque = 500.SI<NewtonMeter>(); - - var t = 0.SI<Second>(); - - var expected = new[] { 6100, 3100, 2300, 4500, 6100 }; - foreach (var e in expected) { - aux.OutPort().Request(t, t, torque, speed); - Assert.AreEqual(speed, port.AngularVelocity); - var newTorque = torque + e.SI<Watt>() / speed; - AssertHelper.AreRelativeEqual(port.Torque, newTorque); - - cycle.CommitSimulationStep(null); - } - } - - [TestMethod] - public void AuxAllCombined() - { - var dataWriter = new MockModalDataWriter(); - dataWriter.AddAuxiliary("ALT1"); - dataWriter.AddAuxiliary("CONSTANT"); - - var container = new VehicleContainer(dataWriter); - var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); - // cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file. - // ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ... - // ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ... - - var cycle = new MockDrivingCycle(container, data); - var port = new MockTnOutPort(); - - var aux = new Auxiliary(container); - aux.InPort().Connect(port); - - var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux"); - // ratio = 4.078 - // efficiency_engine = 0.96 - // efficiency_supply = 0.98 - - aux.AddMapping("ALT1", cycle, auxData); - aux.AddDirect(cycle); - var constPower = 1200.SI<Watt>(); - aux.AddConstant("CONSTANT", constPower); - - var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio - var torque = 500.SI<NewtonMeter>(); - var t = 0.SI<Second>(); - var expected = new[] { - 1200 + 6100 + 72.9166666666667, - // = 1000 * 0.07 (nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply) - 1200 + 3100 + 677.083333333333, - // = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98 (efficiency_supply) - 1200 + 2300 + 822.916666666667, - // = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98 (efficiency_supply) - 1200 + 4500 + 1031.25, // = ... - 1200 + 6100 + 1166.66666666667, - 1200 + 6100 + 1656.25, - 1200 + 6100 + 2072.91666666667, - 1200 + 6100 + 2510.41666666667, - 1200 + 6100 + 2979.16666666667, - 1200 + 6100 + 3322.91666666667, - 1200 + 6100 + 3656.25 - }; - - foreach (var e in expected) { - aux.OutPort().Request(t, t, torque, speed); - Assert.AreEqual(speed, port.AngularVelocity); - - AssertHelper.AreRelativeEqual(port.Torque, torque + e.SI<Watt>() / speed); - - cycle.CommitSimulationStep(null); - } - } - - [TestMethod] - public void AuxMapping() - { - var auxId = "ALT1"; - var dataWriter = new MockModalDataWriter(); - dataWriter.AddAuxiliary(auxId); - - var container = new VehicleContainer(dataWriter); - var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); - // cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file. - // ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ... - // ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ... - - var cycle = new MockDrivingCycle(container, data); - var port = new MockTnOutPort(); - - var aux = new Auxiliary(container); - aux.InPort().Connect(port); - - var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux"); - // ratio = 4.078 - // efficiency_engine = 0.96 - // efficiency_supply = 0.98 - - aux.AddMapping(auxId, cycle, auxData); - - var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio - var torque = 500.SI<NewtonMeter>(); - var t = 0.SI<Second>(); - var expected = new[] { - 72.9166666666667, - // = 1000 * 0.07 (pmech from aux file at nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply) - 677.083333333333, // = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98 - 822.916666666667, // = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98 - 1031.25, // = ... - 1166.66666666667, - 1656.25, - 2072.91666666667, - 2510.41666666667, - 2979.16666666667, - 3322.91666666667, - 3656.25 - }; - - foreach (var e in expected) { - aux.OutPort().Request(t, t, torque, speed); - Assert.AreEqual(speed, port.AngularVelocity); - - AssertHelper.AreRelativeEqual(port.Torque, torque + e.SI<Watt>() / speed); - - cycle.CommitSimulationStep(null); - } - } - - [TestMethod] - public void AuxColumnMissing() - { - var container = new VehicleContainer(); - var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); - var cycle = new MockDrivingCycle(container, data); - - var aux = new Auxiliary(container); - AssertHelper.Exception<VectoException>(() => aux.AddMapping("NONEXISTING_AUX", cycle, null), - "driving cycle does not contain column for auxiliary: NONEXISTING_AUX"); - } - - [TestMethod] - public void AuxFileMissing() - { - AssertHelper.Exception<VectoException>(() => AuxiliaryData.ReadFromFile(@"NOT_EXISTING_AUX_FILE.vaux"), - "Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux"); - } - - [TestMethod, Ignore] - public void AuxReadJobFileDeclarationMode() - { - var sumWriter = new SummaryFileWriter(@"AuxReadJobFileDeclarationMode.vsum"); - var jobContainer = new JobContainer(sumWriter); - - var runsFactory = new SimulatorFactory(SimulatorFactory.FactoryMode.DeclarationMode, - @"TestData\Jobs\40t_Long_Haul_Truck.vecto"); - - jobContainer.AddRuns(runsFactory); - jobContainer.Execute(); - - ResultFileHelper.TestSumFile(@"TestData\Results\Declaration\40t_Long_Haul_Truck.vsum", - @"AuxReadJobFileDeclarationMode.vsum"); - } - - [TestMethod, Ignore] - public void AuxReadJobFileEngineeringMode() - { - var sumWriter = new SummaryFileWriter(@"AuxReadJobFileEngineeringMode.vsum"); - var jobContainer = new JobContainer(sumWriter); - - var runsFactory = new SimulatorFactory(SimulatorFactory.FactoryMode.EngineeringMode, - @"TestData\Jobs\24t Coach.vecto"); - - jobContainer.AddRuns(runsFactory); - jobContainer.Execute(); - - ResultFileHelper.TestSumFile(@"TestData\Results\Engineering\24t Coach.vsum", - @"AuxReadJobFileEngineeringMode.vsum"); - - ResultFileHelper.TestModFile( - @"TestData\Results\Engineering\24t Coach_Coach_24t_xshort.vmod", - @"TestData\Jobs\24t Coach_Coach_24t_xshort.vmod"); - Assert.Inconclusive(); - } - - [TestMethod] - public void AuxDeclarationWrongConfiguration() - { - // test what happens if there was a wrong auxiliary configuration in declaration mode - Assert.Inconclusive(); - } - - [TestMethod] - public void AuxCycleAdditionalFieldMissing() - { - // test the case when the Padd field is missing (no direct auxiliary) - Assert.Inconclusive(); - } - } + [TestClass] + public class AuxTests + { + [TestMethod] + public void AuxWriteModFileSumFile() + { + var dataWriter = new ModalDataWriter(@"AuxWriteModFileSumFile.vmod"); + dataWriter.AddAuxiliary("FAN"); + dataWriter.AddAuxiliary("PS"); + dataWriter.AddAuxiliary("STP"); + dataWriter.AddAuxiliary("ES"); + dataWriter.AddAuxiliary("AC"); + + var sumWriter = new SummaryFileWriter(@"AuxWriteModFileSumFile.vsum"); + var container = new VehicleContainer(dataWriter, + (writer, mass, loading) => sumWriter.WriteFullPowertrain(dataWriter, "", "", "", null, null)); + var data = DrivingCycleDataReader.ReadFromFileDistanceBased(@"TestData\Cycles\LongHaul_short.vdri"); + var mockcycle = new MockDrivingCycle(container, data); + var port = new MockTnOutPort(); + + var aux = new Auxiliary(container); + aux.InPort().Connect(port); + + var hdvClass = VehicleClass.Class5; + var mission = MissionType.LongHaul; + + aux.AddConstant("FAN", + DeclarationData.Fan.Lookup(MissionType.LongHaul, "Hydraulic driven - Constant displacement pump")); + aux.AddConstant("PS", DeclarationData.PneumaticSystem.Lookup(mission, hdvClass)); + aux.AddConstant("STP", + DeclarationData.SteeringPump.Lookup(MissionType.LongHaul, hdvClass, "Variable displacement")); + aux.AddConstant("ES", DeclarationData.ElectricSystem.Lookup(mission, null)); + aux.AddConstant("AC", + DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hdvClass)); + + var speed = 1400.RPMtoRad(); + var torque = 500.SI<NewtonMeter>(); + var t = 0.SI<Second>(); + var dt = 1.SI<Second>(); + + for (var i = 0; i < 11; i++) { + aux.OutPort().Request(t, dt, torque, speed); + dataWriter[ModalResultField.dist] = i.SI<Meter>(); + dataWriter[ModalResultField.Pe_eng] = 0.SI<Watt>(); + dataWriter[ModalResultField.acc] = 0.SI<MeterPerSquareSecond>(); + container.CommitSimulationStep(t, dt); + t += dt; + } + + container.FinishSimulation(); + sumWriter.Finish(); + + //todo: add aux columns to test + var testColumns = new[] { "Paux_FAN", "Paux_STP", "Paux_AC", "Paux_ES", "Paux_PS", "Paux" }; + + ResultFileHelper.TestModFile( + @"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod", + @"AuxWriteModFileSumFile.vmod", testColumns, testRowCount: false); + ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck.vsum", + @"AuxWriteModFileSumFile.vsum"); + } + + [TestMethod] + public void AuxConstant() + { + var dataWriter = new MockModalDataWriter(); + var container = new VehicleContainer(dataWriter); + var port = new MockTnOutPort(); + var aux = new Auxiliary(container); + aux.InPort().Connect(port); + + var constPower = 1200.SI<Watt>(); + aux.AddConstant("CONSTANT", constPower); + + var speed = 2358.RPMtoRad(); + var torque = 500.SI<NewtonMeter>(); + var t = 0.SI<Second>(); + aux.OutPort().Request(t, t, torque, speed); + Assert.AreEqual(speed, port.AngularVelocity); + var newTorque = torque + constPower / speed; + AssertHelper.AreRelativeEqual(port.Torque, newTorque); + + speed = 2358.RPMtoRad(); + torque = 1500.SI<NewtonMeter>(); + aux.OutPort().Request(t, t, torque, speed); + Assert.AreEqual(speed, port.AngularVelocity); + newTorque = torque + constPower / speed; + AssertHelper.AreRelativeEqual(port.Torque, newTorque); + + speed = 1500.RPMtoRad(); + torque = 1500.SI<NewtonMeter>(); + aux.OutPort().Request(t, t, torque, speed); + Assert.AreEqual(speed, port.AngularVelocity); + newTorque = torque + constPower / speed; + AssertHelper.AreRelativeEqual(port.Torque, newTorque); + } + + [TestMethod] + public void AuxDirect() + { + var dataWriter = new MockModalDataWriter(); + var container = new VehicleContainer(dataWriter); + var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); + var cycle = new MockDrivingCycle(container, data); + var port = new MockTnOutPort(); + var aux = new Auxiliary(container); + aux.InPort().Connect(port); + + aux.AddDirect(cycle); + + var speed = 2358.RPMtoRad(); + var torque = 500.SI<NewtonMeter>(); + + var t = 0.SI<Second>(); + + var expected = new[] { 6100, 3100, 2300, 4500, 6100 }; + foreach (var e in expected) { + aux.OutPort().Request(t, t, torque, speed); + Assert.AreEqual(speed, port.AngularVelocity); + var newTorque = torque + e.SI<Watt>() / speed; + AssertHelper.AreRelativeEqual(port.Torque, newTorque); + + cycle.CommitSimulationStep(null); + } + } + + [TestMethod] + public void AuxAllCombined() + { + var dataWriter = new MockModalDataWriter(); + dataWriter.AddAuxiliary("ALT1"); + dataWriter.AddAuxiliary("CONSTANT"); + + var container = new VehicleContainer(dataWriter); + var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); + // cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file. + // ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ... + // ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ... + + var cycle = new MockDrivingCycle(container, data); + var port = new MockTnOutPort(); + + var aux = new Auxiliary(container); + aux.InPort().Connect(port); + + var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux"); + // ratio = 4.078 + // efficiency_engine = 0.96 + // efficiency_supply = 0.98 + + aux.AddMapping("ALT1", cycle, auxData); + aux.AddDirect(cycle); + var constPower = 1200.SI<Watt>(); + aux.AddConstant("CONSTANT", constPower); + + var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio + var torque = 500.SI<NewtonMeter>(); + var t = 0.SI<Second>(); + var expected = new[] { + 1200 + 6100 + 72.9166666666667, + // = 1000 * 0.07 (nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply) + 1200 + 3100 + 677.083333333333, + // = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98 (efficiency_supply) + 1200 + 2300 + 822.916666666667, + // = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98 (efficiency_supply) + 1200 + 4500 + 1031.25, // = ... + 1200 + 6100 + 1166.66666666667, + 1200 + 6100 + 1656.25, + 1200 + 6100 + 2072.91666666667, + 1200 + 6100 + 2510.41666666667, + 1200 + 6100 + 2979.16666666667, + 1200 + 6100 + 3322.91666666667, + 1200 + 6100 + 3656.25 + }; + + foreach (var e in expected) { + aux.OutPort().Request(t, t, torque, speed); + Assert.AreEqual(speed, port.AngularVelocity); + + AssertHelper.AreRelativeEqual(port.Torque, torque + e.SI<Watt>() / speed); + + cycle.CommitSimulationStep(null); + } + } + + [TestMethod] + public void AuxMapping() + { + var auxId = "ALT1"; + var dataWriter = new MockModalDataWriter(); + dataWriter.AddAuxiliary(auxId); + + var container = new VehicleContainer(dataWriter); + var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); + // cycle ALT1 is set to values to equal the first few fixed points in the auxiliary file. + // ALT1.aux file: nAuxiliary speed 2358: 0, 0.38, 0.49, 0.64, ... + // ALT1 in cycle file: 0, 0.3724 (=0.38*0.96), 0.4802 (=0.49*0.96), 0.6272 (0.64*0.96), ... + + var cycle = new MockDrivingCycle(container, data); + var port = new MockTnOutPort(); + + var aux = new Auxiliary(container); + aux.InPort().Connect(port); + + var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux"); + // ratio = 4.078 + // efficiency_engine = 0.96 + // efficiency_supply = 0.98 + + aux.AddMapping(auxId, cycle, auxData); + + var speed = 578.22461991.RPMtoRad(); // = 2358 (nAuxiliary) * ratio + var torque = 500.SI<NewtonMeter>(); + var t = 0.SI<Second>(); + var expected = new[] { + 72.9166666666667, + // = 1000 * 0.07 (pmech from aux file at nAuxiliary=2358 and psupply=0) / 0.98 (efficiency_supply) + 677.083333333333, // = 1000 * 0.65 (nAuxiliary=2358 and psupply=0.38) / 0.98 + 822.916666666667, // = 1000 * 0.79 (nAuxiliary=2358 and psupply=0.49) / 0.98 + 1031.25, // = ... + 1166.66666666667, + 1656.25, + 2072.91666666667, + 2510.41666666667, + 2979.16666666667, + 3322.91666666667, + 3656.25 + }; + + foreach (var e in expected) { + aux.OutPort().Request(t, t, torque, speed); + Assert.AreEqual(speed, port.AngularVelocity); + + AssertHelper.AreRelativeEqual(port.Torque, torque + e.SI<Watt>() / speed); + + cycle.CommitSimulationStep(null); + } + } + + [TestMethod] + public void AuxColumnMissing() + { + var container = new VehicleContainer(); + var data = DrivingCycleDataReader.ReadFromFileTimeBased(@"TestData\Cycles\Coach time based short.vdri"); + var cycle = new MockDrivingCycle(container, data); + + var aux = new Auxiliary(container); + AssertHelper.Exception<VectoException>(() => aux.AddMapping("NONEXISTING_AUX", cycle, null), + "driving cycle does not contain column for auxiliary: NONEXISTING_AUX"); + } + + [TestMethod] + public void AuxFileMissing() + { + AssertHelper.Exception<VectoException>(() => AuxiliaryData.ReadFromFile(@"NOT_EXISTING_AUX_FILE.vaux"), + "Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux"); + } + + [TestMethod, Ignore] + public void AuxReadJobFileDeclarationMode() + { + var sumWriter = new SummaryFileWriter(@"AuxReadJobFileDeclarationMode.vsum"); + var jobContainer = new JobContainer(sumWriter); + + var runsFactory = new SimulatorFactory(ExecutionMode.Declaration, + @"TestData\Jobs\40t_Long_Haul_Truck.vecto"); + + jobContainer.AddRuns(runsFactory); + jobContainer.Execute(); + + ResultFileHelper.TestSumFile(@"TestData\Results\Declaration\40t_Long_Haul_Truck.vsum", + @"AuxReadJobFileDeclarationMode.vsum"); + } + + [TestMethod, Ignore] + public void AuxReadJobFileEngineeringMode() + { + var sumWriter = new SummaryFileWriter(@"AuxReadJobFileEngineeringMode.vsum"); + var jobContainer = new JobContainer(sumWriter); + + var runsFactory = new SimulatorFactory(ExecutionMode.Engineering, + @"TestData\Jobs\24t Coach.vecto"); + + jobContainer.AddRuns(runsFactory); + jobContainer.Execute(); + + ResultFileHelper.TestSumFile(@"TestData\Results\Engineering\24t Coach.vsum", + @"AuxReadJobFileEngineeringMode.vsum"); + + ResultFileHelper.TestModFile( + @"TestData\Results\Engineering\24t Coach_Coach_24t_xshort.vmod", + @"TestData\Jobs\24t Coach_Coach_24t_xshort.vmod"); + Assert.Inconclusive(); + } + + [TestMethod] + public void AuxDeclarationWrongConfiguration() + { + // test what happens if there was a wrong auxiliary configuration in declaration mode + Assert.Inconclusive(); + } + + [TestMethod] + public void AuxCycleAdditionalFieldMissing() + { + // test the case when the Padd field is missing (no direct auxiliary) + Assert.Inconclusive(); + } + } } \ No newline at end of file diff --git a/VectoCoreTest/Models/Simulation/SimulationTests.cs b/VectoCoreTest/Models/Simulation/SimulationTests.cs index aaad3c987ed758163a130ce9fb58d8e7a971334f..bd7dfccc153e41dca38f411b343a1cc530401656 100644 --- a/VectoCoreTest/Models/Simulation/SimulationTests.cs +++ b/VectoCoreTest/Models/Simulation/SimulationTests.cs @@ -87,10 +87,10 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation { var sumFileName = resultFileName.Substring(0, resultFileName.Length - 5) + Constants.FileExtensions.SumFile; - var dataWriter = new ModalDataWriter(resultFileName, SimulatorFactory.FactoryMode.EngineOnlyMode); + var dataWriter = new ModalDataWriter(resultFileName, ExecutionMode.EngineOnly); var sumWriter = new SummaryFileWriter(sumFileName); - var factory = new SimulatorFactory(SimulatorFactory.FactoryMode.EngineOnlyMode, EngineOnlyJob) { + var factory = new SimulatorFactory(ExecutionMode.EngineOnly, EngineOnlyJob) { SumWriter = sumWriter }; @@ -103,7 +103,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation var sumWriter = new SummaryFileWriter(@"24t Coach.vsum"); var jobContainer = new JobContainer(sumWriter); - var runsFactory = new SimulatorFactory(SimulatorFactory.FactoryMode.EngineOnlyMode, + var runsFactory = new SimulatorFactory(ExecutionMode.EngineOnly, @"TestData\Jobs\24t Coach EngineOnly.vecto"); jobContainer.AddRuns(runsFactory); diff --git a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs index e195014e530d63bb5c73adf2f0611d6a96aa5546..6f6006b202e708a880f89094f50901b738fcce25 100644 --- a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs @@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var driverData = CreateDriverData(); var modalWriter = new ModalDataWriter("Coach_MinimalPowertrain_Coasting.vmod", - SimulatorFactory.FactoryMode.EngineeringMode); //new TestModalDataWriter(); + ExecutionMode.Engineering); //new TestModalDataWriter(); var vehicleContainer = new VehicleContainer(modalWriter); var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy()); @@ -163,7 +163,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var driverData = CreateDriverData(); var modalWriter = new ModalDataWriter("Coach_MinimalPowertrain.vmod", - SimulatorFactory.FactoryMode.EngineeringMode); + ExecutionMode.Engineering); var vehicleContainer = new VehicleContainer(modalWriter); var cycle = new MockDrivingCycle(vehicleContainer, null);