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 a47eb2d6 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

remove gear full-load, added gear max torque

parent 0d735af1
No related branches found
No related tags found
No related merge requests found
......@@ -222,11 +222,16 @@ namespace TUGraz.VectoCommon.InputData
/// </summary>
double Efficiency { get; }
///// <summary>
///// P145
///// cf. VECTO Input Parameters.xlsx
///// </summary>
//DataTable FullLoadCurve { get; } // deprecated
/// <summary>
/// P145
/// cf. VECTO Input Parameters.xlsx
/// P157
/// </summary>
DataTable FullLoadCurve { get; }
NewtonMeter MaxTorque { get; }
/// <summary>
/// P082
......
......@@ -149,9 +149,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
var inputData = new TransmissionInputData {
Gear = i,
Ratio = gear.GetEx<double>(JsonKeys.Gearbox_Gear_Ratio),
FullLoadCurve =
ReadTableData(gear.GetEx<string>(JsonKeys.Gearbox_Gear_FullLoadCurveFile), string.Format("Gear {0} FLD", i),
false),
MaxTorque = gear["MaxTorque"] != null ? gear["MaxTorque"].Value<double>().SI<NewtonMeter>() : null,
LossMap =
gear[JsonKeys.Gearbox_Gear_LossMapFile] != null
? ReadTableData(gear.GetEx<string>(JsonKeys.Gearbox_Gear_LossMapFile), string.Format("Gear {0} LossMap", i))
......
......@@ -91,7 +91,7 @@ namespace TUGraz.VectoCore.InputData.Impl
public double Efficiency { get; internal set; }
public DataTable FullLoadCurve { get; internal set; }
public NewtonMeter MaxTorque { get; internal set; }
public DataTable ShiftPolygon { get; internal set; }
......
......@@ -231,22 +231,53 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
/// <param name="engineCurve"></param>
/// <param name="gearCurve"></param>
/// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns>
internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, FullLoadCurve gearCurve)
internal static EngineFullLoadCurve IntersectFullLoadCurves(EngineFullLoadCurve engineCurve, NewtonMeter maxTorque)
{
if (gearCurve == null) {
if (maxTorque == null) {
return engineCurve;
}
// TODO mk-2016-04-18: refactor when new gearbox full load is implemented: gearbox will then only have 1 constant value as full load.
var entries =
gearCurve.FullLoadEntries.Concat(engineCurve.FullLoadEntries)
.OrderBy(x => x.EngineSpeed)
.DistinctBy((x, y) => x.EngineSpeed.Value().IsEqual(y.EngineSpeed.Value()))
.Select(x => new FullLoadCurve.FullLoadCurveEntry {
EngineSpeed = x.EngineSpeed,
TorqueFullLoad =
VectoMath.Min(engineCurve.FullLoadStationaryTorque(x.EngineSpeed),
gearCurve.FullLoadStationaryTorque(x.EngineSpeed))
var entries = new List<FullLoadCurve.FullLoadCurveEntry>();
var firstEntry = engineCurve.FullLoadEntries.First();
if (firstEntry.TorqueFullLoad < maxTorque) {
entries.Add(engineCurve.FullLoadEntries.First());
} else {
entries.Add(new FullLoadCurve.FullLoadCurveEntry {
EngineSpeed = firstEntry.EngineSpeed,
TorqueFullLoad = maxTorque,
TorqueDrag = firstEntry.TorqueDrag
});
}
foreach (var entry in engineCurve.FullLoadEntries.Pairwise(Tuple.Create)) {
if (entry.Item1.TorqueFullLoad <= maxTorque && entry.Item2.TorqueFullLoad <= maxTorque) {
// segment is below maxTorque line -> use directly
entries.Add(entry.Item2);
} else if (entry.Item1.TorqueFullLoad > maxTorque && entry.Item2.TorqueFullLoad > maxTorque) {
// segment is above maxTorque line -> add limited entry
entries.Add(new FullLoadCurve.FullLoadCurveEntry {
EngineSpeed = entry.Item2.EngineSpeed,
TorqueFullLoad = maxTorque,
TorqueDrag = entry.Item2.TorqueDrag
});
} else {
// segment intersects maxTorque line -> add new entry at intersection
var edgeFull = Edge.Create(new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueFullLoad.Value()),
new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueFullLoad.Value()));
var edgeDrag = Edge.Create(new Point(entry.Item1.EngineSpeed.Value(), entry.Item1.TorqueDrag.Value()),
new Point(entry.Item2.EngineSpeed.Value(), entry.Item2.TorqueDrag.Value()));
var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY;
entries.Add(new FullLoadCurve.FullLoadCurveEntry {
EngineSpeed = intersectionX.SI<PerSecond>(),
TorqueFullLoad = maxTorque,
TorqueDrag = VectoMath.Interpolate(edgeDrag.P1, edgeDrag.P2, intersectionX).SI<NewtonMeter>()
});
entries.Add(new FullLoadCurve.FullLoadCurveEntry {
EngineSpeed = entry.Item2.EngineSpeed,
TorqueFullLoad = entry.Item2.TorqueFullLoad > maxTorque ? maxTorque : entry.Item2.TorqueFullLoad,
TorqueDrag = entry.Item2.TorqueDrag
});
}
}
var flc = new EngineFullLoadCurve {
FullLoadEntries = entries.ToList(),
......
......@@ -203,11 +203,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
throw;
}
}
var gearFullLoad = gear.FullLoadCurve == null
? null
: FullLoadCurveReader.Create(gear.FullLoadCurve, true);
var fullLoadCurve = IntersectFullLoadCurves(engine.FullLoadCurve, gearFullLoad);
var fullLoadCurve = IntersectFullLoadCurves(engine.FullLoadCurve, gear.MaxTorque);
var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gears, engine, axlegearRatio,
dynamicTyreRadius);
......@@ -215,7 +212,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
new GearData {
LossMap = gearLossMap,
ShiftPolygon = shiftPolygon,
FullLoadCurve = gearFullLoad,
MaxTorque = gear.MaxTorque,
Ratio = gear.Ratio,
TorqueConverterActive = false
});
......
......@@ -149,10 +149,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
} else {
throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1);
}
var gearFullLoad = gear.FullLoadCurve != null
? FullLoadCurveReader.Create(gear.FullLoadCurve)
: null;
var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gearFullLoad);
var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque);
var shiftPolygon = gear.ShiftPolygon != null
? ShiftPolygonReader.Create(gear.ShiftPolygon)
: DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurve, gears, engineData, axlegearRatio, dynamicTyreRadius);
......@@ -160,7 +158,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
return new KeyValuePair<uint, GearData>((uint)(i + 1), new GearData {
LossMap = lossMap,
ShiftPolygon = shiftPolygon,
FullLoadCurve = gearFullLoad,
MaxTorque = gear.MaxTorque,
Ratio = gear.Ratio,
TorqueConverterActive = gear.TorqueConverterActive
});
......
......@@ -51,7 +51,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
[ValidateObject]
public FullLoadCurve FullLoadCurve { get; internal set; }
// TODO mk-2016-05-09: Refactor TorqueConverterActive Flag when implementing Torque Converter
public bool TorqueConverterActive { get; internal set; }
public NewtonMeter MaxTorque { get; internal set; }
}
}
\ No newline at end of file
......@@ -136,6 +136,7 @@
<Compile Include="InputData\Reader\ComponentData\TransmissionLossMapReader.cs" />
<Compile Include="InputData\Reader\ComponentData\RetarderLossMapReader.cs" />
<Compile Include="InputData\Reader\ComponentData\TorqueConverterDataReader.cs" />
<Compile Include="Models\SimulationComponent\Data\Engine\FuelConsumptionMapReader.cs" />
<Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" />
<Compile Include="Utils\ProviderExtensions.cs" />
<Compile Include="Models\Declaration\AirDrag.cs" />
......
......@@ -301,18 +301,12 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
"2000, 1352, -301",
"2100, 1100, -320",
};
var gbxFldString = new[] {
"560, 2500",
"2100, 2500"
};
var dataEng =
VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm],Mdrag [Nm]", engineFldString));
var engineFld = EngineFullLoadCurve.Create(dataEng, true);
var dataGbx = VectoCSVFile.ReadStream(InputDataHelper.InputDataAsStream("n [U/min],Mfull [Nm]", gbxFldString));
var gbxFld = FullLoadCurveReader.Create(dataGbx, true);
var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFld, gbxFld);
var fullLoadCurve = AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineFld, 2500.SI<NewtonMeter>());
Assert.AreEqual(10, fullLoadCurve.FullLoadEntries.Count);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment