Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 9c49ac27 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

Merge pull request #116 in VECTO/vecto-sim from...

Merge pull request #116 in VECTO/vecto-sim from ~EMQUARIMA/vecto-sim:bugfix/VECTO-182-retarder-does-not-take-into-account to develop

* commit '87dc246f':
  tests: move inputdatastream to separate utility class
  retarder loss map: sort entries by retarder speed ascending!
  retarder loss map: add checks for upper/lower boundary and print warning (engineering mode) or throw exception (declaration mode)
  add ratio property to retarder
parents 154083d4 87dc246f
Branches
Tags
No related merge requests found
......@@ -85,12 +85,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
switch (data.Retarder.Type) {
case RetarderData.RetarderType.Primary:
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap, data.Retarder.Ratio));
tmp = AddComponent(tmp, gearbox);
break;
case RetarderData.RetarderType.Secondary:
tmp = AddComponent(tmp, gearbox);
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap, data.Retarder.Ratio));
break;
case RetarderData.RetarderType.None:
tmp = AddComponent(tmp, new DummyRetarder(container));
......@@ -158,12 +158,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
switch (data.Retarder.Type) {
case RetarderData.RetarderType.Primary:
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap, data.Retarder.Ratio));
tmp = AddComponent(tmp, gearbox);
break;
case RetarderData.RetarderType.Secondary:
tmp = AddComponent(tmp, gearbox);
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap, data.Retarder.Ratio));
break;
case RetarderData.RetarderType.None:
tmp = AddComponent(tmp, gearbox);
......@@ -236,12 +236,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
switch (data.Retarder.Type) {
case RetarderData.RetarderType.Primary:
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap, data.Retarder.Ratio));
tmp = AddComponent(tmp, GetGearbox(container, data.GearboxData));
break;
case RetarderData.RetarderType.Secondary:
tmp = AddComponent(tmp, GetGearbox(container, data.GearboxData));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap));
tmp = AddComponent(tmp, new Retarder(container, data.Retarder.LossMap, data.Retarder.Ratio));
break;
case RetarderData.RetarderType.None:
tmp = AddComponent(tmp, GetGearbox(container, data.GearboxData));
......
......@@ -60,11 +60,29 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName).Reverse()));
entries = CreateFromColumnIndizes(data);
}
entries.Sort((entry1, entry2) => entry1.RetarderSpeed.Value().CompareTo(entry2.RetarderSpeed.Value()));
return new RetarderLossMap { _entries = entries };
}
public NewtonMeter RetarderLoss(PerSecond angularVelocity)
public NewtonMeter RetarderLoss(PerSecond angularVelocity, bool allowExtrapolation)
{
if (angularVelocity < _entries.First().RetarderSpeed) {
if (!allowExtrapolation) {
throw new VectoSimulationException("angular velocity {0} below min. entry in retarder loss map ({1})",
angularVelocity, _entries.First().RetarderSpeed);
}
Log.Warn("Extrapolating retarder losses! Angular velocity {0} below min. entry in retarder loss map ({1})",
angularVelocity, _entries.First().RetarderSpeed);
}
if (angularVelocity > _entries.Last().RetarderSpeed) {
if (!allowExtrapolation) {
throw new VectoSimulationException("angular velocity {0} above max. entry in retarder loss map ({1})",
angularVelocity, _entries.Last().RetarderSpeed);
}
Log.Warn("Extrapolating retarder losses! Angular velocity {0} above max. entry in retarder loss map ({1})",
angularVelocity, _entries.Last().RetarderSpeed);
}
var idx = FindIndex(angularVelocity);
return VectoMath.Interpolate(_entries[idx - 1].RetarderSpeed, _entries[idx].RetarderSpeed,
_entries[idx - 1].TorqueLoss, _entries[idx].TorqueLoss, angularVelocity);
......
......@@ -20,6 +20,7 @@ using System;
using TUGraz.VectoCore.Models.Connector.Ports;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.OutputData;
using TUGraz.VectoCore.Utils;
......@@ -32,10 +33,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected ITnOutPort NextComponent;
private readonly RetarderLossMap _lossMap;
private double _ratio;
public Retarder(IVehicleContainer cockpit, RetarderLossMap lossMap) : base(cockpit)
public Retarder(IVehicleContainer cockpit, RetarderLossMap lossMap, double ratio) : base(cockpit)
{
_lossMap = lossMap;
_ratio = ratio;
}
protected override void DoWriteModalResults(IModalDataContainer container)
......@@ -68,7 +71,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return NextComponent.Request(absTime, dt, torque, null, dryRun);
}
var avgAngularSpeed = (PreviousState.InAngularVelocity + angularVelocity) / 2.0;
var retarderTorqueLoss = _lossMap.RetarderLoss(avgAngularSpeed);
var retarderTorqueLoss =
_lossMap.RetarderLoss(avgAngularSpeed * _ratio, DataBus.ExecutionMode != ExecutionMode.Declaration) / _ratio;
CurrentState.SetState(torque + retarderTorqueLoss, angularVelocity, torque, angularVelocity);
return NextComponent.Request(absTime, dt, torque + retarderTorqueLoss, angularVelocity, dryRun);
......@@ -76,7 +80,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity)
{
var retarderTorqueLoss = _lossMap.RetarderLoss(angularVelocity);
var retarderTorqueLoss =
_lossMap.RetarderLoss(angularVelocity * _ratio, DataBus.ExecutionMode != ExecutionMode.Declaration) / _ratio;
PreviousState.SetState(torque + retarderTorqueLoss, angularVelocity, torque, angularVelocity);
return NextComponent.Initialize(torque + retarderTorqueLoss, angularVelocity);
......
......@@ -20,6 +20,7 @@ using System.Diagnostics.CodeAnalysis;
using System.IO;
using TUGraz.VectoCore.InputData.Reader;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Tests.Utils;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Tests.Integration
......@@ -29,22 +30,11 @@ namespace TUGraz.VectoCore.Tests.Integration
{
public static DrivingCycleData CreateCycleData(string[] entries)
{
var cycleData = InputDataAsStream("<s>,<v>,<grad>,<stop>", entries);
var cycleData = InputDataHelper.InputDataAsStream("<s>,<v>,<grad>,<stop>", entries);
return DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased);
}
public static MemoryStream InputDataAsStream(string header, string[] entries)
{
var cycleData = new MemoryStream();
var writer = new StreamWriter(cycleData);
writer.WriteLine(header);
foreach (var entry in entries) {
writer.WriteLine(entry);
}
writer.Flush();
cycleData.Seek(0, SeekOrigin.Begin);
return cycleData;
}
#region Accelerate
......
......@@ -17,10 +17,13 @@
*/
using System;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TUGraz.VectoCore.Exceptions;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
using TUGraz.VectoCore.Tests.Integration;
using TUGraz.VectoCore.Tests.Utils;
using TUGraz.VectoCore.Utils;
......@@ -37,7 +40,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var vehicle = new VehicleContainer();
var retarderData = RetarderLossMap.ReadFromFile(RetarderLossMapFile);
var retarder = new Retarder(vehicle, retarderData);
var retarder = new Retarder(vehicle, retarderData, 1.0);
var nextRequest = new MockTnOutPort();
......@@ -68,5 +71,95 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
Assert.AreEqual(1550.RPMtoRad().Value(), nextRequest.AngularVelocity.Value(), Delta);
Assert.AreEqual(50 + 14.81, nextRequest.Torque.Value(), Delta);
}
[TestMethod]
public void RetarderRatioTest()
{
var vehicle = new VehicleContainer(null, null, ExecutionMode.Engineering);
var retarderData = RetarderLossMap.ReadFromFile(RetarderLossMapFile);
var retarder = new Retarder(vehicle, retarderData, 2.0);
var nextRequest = new MockTnOutPort();
retarder.InPort().Connect(nextRequest);
var outPort = retarder.OutPort();
var absTime = 0.SI<Second>();
var dt = 0.SI<Second>();
// --------
outPort.Initialize(0.SI<NewtonMeter>(), 10.RPMtoRad());
outPort.Request(absTime, dt, 0.SI<NewtonMeter>(), 10.RPMtoRad());
Assert.AreEqual(10.RPMtoRad().Value(), nextRequest.AngularVelocity.Value(), Delta);
Assert.AreEqual(5.002, nextRequest.Torque.Value(), Delta);
// --------
outPort.Initialize(100.SI<NewtonMeter>(), 1000.RPMtoRad());
outPort.Request(absTime, dt, 100.SI<NewtonMeter>(), 1000.RPMtoRad());
Assert.AreEqual(1000.RPMtoRad().Value(), nextRequest.AngularVelocity.Value(), Delta);
Assert.AreEqual(109, nextRequest.Torque.Value(), Delta);
// --------
outPort.Initialize(50.SI<NewtonMeter>(), 1550.RPMtoRad());
outPort.Request(absTime, dt, 50.SI<NewtonMeter>(), 1550.RPMtoRad());
Assert.AreEqual(1550.RPMtoRad().Value(), nextRequest.AngularVelocity.Value(), Delta);
Assert.AreEqual(50 + 13.89, nextRequest.Torque.Value(), Delta); // extrapolated
}
[TestMethod]
public void RetarderDeclarationTest()
{
var retarderData = RetarderLossMap.ReadFromFile(RetarderLossMapFile);
var declVehicle = new VehicleContainer(null, null, ExecutionMode.Declaration);
var retarder = new Retarder(declVehicle, retarderData, 2.0);
var nextRequest = new MockTnOutPort();
retarder.InPort().Connect(nextRequest);
var outPort = retarder.OutPort();
var absTime = 0.SI<Second>();
var dt = 0.SI<Second>();
// --------
AssertHelper.Exception<VectoSimulationException>(() => outPort.Initialize(50.SI<NewtonMeter>(), 1550.RPMtoRad()),
"angular velocity 324.6312 [1/s] above max. entry in retarder loss map (240.8554 [1/s])");
}
[TestMethod]
public void RetarderDataSorting()
{
var retarderEntries = new[] {
"100,10.02",
"0,10",
"200,10.08",
"500,10.5",
"300,10.18",
"400,10.32",
};
var retarderTbl =
VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("Retarder Speed [rpm],Loss Torque [Nm]",
retarderEntries));
var vehicle = new VehicleContainer(null, null, ExecutionMode.Engineering);
var retarderData = RetarderLossMap.Create(retarderTbl);
var retarder = new Retarder(vehicle, retarderData, 2.0);
var nextRequest = new MockTnOutPort();
retarder.InPort().Connect(nextRequest);
var outPort = retarder.OutPort();
var absTime = 0.SI<Second>();
var dt = 0.SI<Second>();
// --------
outPort.Initialize(100.SI<NewtonMeter>(), 125.RPMtoRad());
outPort.Request(absTime, dt, 100.SI<NewtonMeter>(), 125.RPMtoRad());
Assert.AreEqual(125.RPMtoRad().Value(), nextRequest.AngularVelocity.Value(), Delta);
Assert.AreEqual(100 + 5.065, nextRequest.Torque.Value(), Delta);
}
}
}
\ No newline at end of file
......@@ -302,10 +302,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
"2100, 2500"
};
var dataEng =
VectoCSVFile.ReadStream(SimpleDrivingCycles.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm]", engineFLDString));
VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm]", engineFLDString));
var engineFLD = EngineFullLoadCurve.Create(dataEng, true);
var dataGbx = VectoCSVFile.ReadStream(SimpleDrivingCycles.InputDataAsStream("n [U/min],Mfull [Nm]", gbxFLDString));
var dataGbx = VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm]", gbxFLDString));
var gbxFLD = FullLoadCurve.Create(dataGbx, true);
var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFLD, gbxFLD);
......
using System.IO;
namespace TUGraz.VectoCore.Tests.Utils
{
public class InputDataHelper
{
public static MemoryStream InputDataAsStream(string header, string[] entries)
{
var cycleData = new MemoryStream();
var writer = new StreamWriter(cycleData);
writer.WriteLine(header);
foreach (var entry in entries) {
writer.WriteLine(entry);
}
writer.Flush();
cycleData.Seek(0, SeekOrigin.Begin);
return cycleData;
}
}
}
\ No newline at end of file
......@@ -91,6 +91,7 @@
<Compile Include="Integration\SimulationRuns\FullPowertrain.cs" />
<Compile Include="Integration\Truck40tPowerTrain.cs" />
<Compile Include="Models\SimulationComponent\GearboxPowertrainTest.cs" />
<Compile Include="Utils\InputDataHelper.cs" />
<Compile Include="Utils\MockSimulationDataFactory.cs" />
<Compile Include="Utils\Port.cs" />
<Compile Include="Models\SimulationComponentData\AuxiliaryTypeHelperTest.cs" />
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment