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 0f3debe8 authored by Raphael LUZ's avatar Raphael LUZ
Browse files

Implemented rated speed calculation in full load curve component and test case

parent 63dca4b8
No related branches found
No related tags found
No related merge requests found
......@@ -2,6 +2,7 @@
using System.Data;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Linq.Expressions;
using Common.Logging;
using Newtonsoft.Json;
using TUGraz.VectoCore.Exceptions;
......@@ -11,26 +12,32 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
{
public class FullLoadCurve : SimulationComponentData
{
[JsonProperty] private List<FullLoadCurveEntry> _entries;
[JsonProperty]
private List<FullLoadCurveEntry> _entries;
public static FullLoadCurve ReadFromFile(string fileName)
{
var data = VectoCSVFile.Read(fileName);
//todo Contract.Requires<VectoException>(data.Columns.Count != 4, "FullLoadCurve Data File must consist of 4 columns.");
if (data.Columns.Count != 4) {
if (data.Columns.Count != 4)
{
throw new VectoException("FullLoadCurve Data File must consist of 4 columns.");
}
//todo Contract.Requires<VectoException>(data.Rows.Count < 2, "FullLoadCurve must consist of at least two lines with numeric values (below file header)");
if (data.Rows.Count < 2) {
if (data.Rows.Count < 2)
{
throw new VectoException("FullLoadCurve must consist of at least two lines with numeric values (below file header)");
}
List<FullLoadCurveEntry> entries;
if (HeaderIsValid(data.Columns)) {
if (HeaderIsValid(data.Columns))
{
entries = CreateFromColumnNames(data);
} else {
}
else
{
var log = LogManager.GetLogger<FullLoadCurve>();
log.WarnFormat(
"FullLoadCurve: Header Line is not valid. Expected: '{0}, {1}, {2}, {3}', Got: '{4}'. Falling back to column index.",
......@@ -56,7 +63,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
{
Contract.Requires(data != null);
return (from DataRow row in data.Rows
select new FullLoadCurveEntry {
select new FullLoadCurveEntry
{
EngineSpeed = row.ParseDouble(Fields.EngineSpeed).SI().Rounds.Per.Minute.To<RadianPerSecond>(),
TorqueFullLoad = row.ParseDouble(Fields.TorqueFullLoad).SI<NewtonMeter>(),
TorqueDrag = row.ParseDouble(Fields.TorqueDrag).SI<NewtonMeter>(),
......@@ -68,7 +76,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
{
Contract.Requires(data != null);
return (from DataRow row in data.Rows
select new FullLoadCurveEntry {
select new FullLoadCurveEntry
{
EngineSpeed = row.ParseDouble(0).SI().Rounds.Per.Minute.To<RadianPerSecond>(),
TorqueFullLoad = row.ParseDouble(1).SI<NewtonMeter>(),
TorqueDrag = row.ParseDouble(2).SI<NewtonMeter>(),
......@@ -151,14 +160,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
Contract.Requires(engineSpeed.HasEqualUnit(new SI().Radian.Per.Second));
int idx;
if (engineSpeed < _entries[0].EngineSpeed) {
if (engineSpeed < _entries[0].EngineSpeed)
{
Log.ErrorFormat("requested rpm below minimum rpm in FLD curve - extrapolating. n: {0}, rpm_min: {1}",
engineSpeed.To().Rounds.Per.Minute, _entries[0].EngineSpeed.To().Rounds.Per.Minute);
idx = 1;
} else {
}
else
{
idx = _entries.FindIndex(x => x.EngineSpeed > engineSpeed);
}
if (idx <= 0) {
if (idx <= 0)
{
idx = engineSpeed > _entries[0].EngineSpeed ? _entries.Count - 1 : 1;
}
return idx;
......@@ -222,10 +235,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) {
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj)) {
if (ReferenceEquals(this, obj))
{
return true;
}
return obj.GetType() == GetType() && Equals((FullLoadCurveEntry)obj);
......@@ -252,10 +267,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) {
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj)) {
if (ReferenceEquals(this, obj))
{
return true;
}
return obj.GetType() == GetType() && Equals((FullLoadCurve)obj);
......@@ -267,5 +284,35 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine
}
#endregion
public RadianPerSecond RatedSpeed()
{
var powerMax = new Watt();
var engineSpeed = new RadianPerSecond();
var engineSpeedMax = new RadianPerSecond();
var engineSpeedRated = new RadianPerSecond();
var engineSpeedStep = 1.0.RPMtoRad();
var power = new Watt();
engineSpeed = _entries.First().EngineSpeed;
engineSpeedMax = _entries.Last().EngineSpeed;
engineSpeedRated = engineSpeed;
do {
power = Formulas.TorqueToPower(FullLoadStationaryTorque(engineSpeed), engineSpeed);
if (power > powerMax) {
powerMax = power;
engineSpeedRated = engineSpeed;
}
engineSpeed = (engineSpeed + engineSpeedStep).To<RadianPerSecond>();
} while (engineSpeed <= engineSpeedMax);
return engineSpeedRated;
}
}
}
\ No newline at end of file
......@@ -13,14 +13,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
public class Clutch:VectoSimulationComponent, IClutch,ITnOutPort,ITnInPort
{
public Clutch(IVehicleContainer cockpit, CombustionEngineData engineData) : base(cockpit)
{
//engineData.IdleSpeed;
private RadianPerSecond _idleSpeed;
private RadianPerSecond _ratedSpeed;
//engineData.GetFullLoadCurve(0).RatedSpeed();
public Clutch(IVehicleContainer cockpit, CombustionEngineData engineData) : base(cockpit)
{
_idleSpeed = engineData.IdleSpeed;
_ratedSpeed= engineData.GetFullLoadCurve(0).RatedSpeed();
}
public override void CommitSimulationStep(IModalDataWriter writer)
{
throw new NotImplementedException();
......
......@@ -21,6 +21,13 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
Assert.AreEqual(1231, (double) fldCurve.FullLoadStationaryTorque(580.0.RPMtoRad()), Tolerance);
}
[TestMethod]
public void TestFullLoadEngineSpeedRated()
{
var fldCurve = FullLoadCurve.ReadFromFile(CoachEngineFLD);
Assert.AreEqual(181.79349, (double)fldCurve.RatedSpeed(), Tolerance);
}
[TestMethod]
public void TestFullLoadStaticPower()
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment