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

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

Merge branch 'bugfix/CodeEU-130_IEPC-max-torque-powermap-0' into 'amdm2/develop'

IEPC: handle the case that power map contains only a single entry with 0 Nm...

See merge request vecto/vecto!64
parents 6e83d0ee be35c709
No related branches found
No related tags found
No related merge requests found
......@@ -35,7 +35,11 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
}
var entries = (from DataRow row in data.Rows select CreateEntry(row)).ToList();
var entriesZero = GetEntriesAtZeroRpm(entries);
var duplicates = entries.GroupBy(x => Tuple.Create(x.MotorSpeed, x.Torque)).Where(g => g.Count() > 1).Select(x => x.Key).ToList();
if (duplicates.Count > 0) {
throw new VectoException("Duplicate entries in EM power map: {0}", duplicates.Select(x => $"{x.Item1.AsRPM} rpm / {x.Item2}").Join());
}
var entriesZero = GetEntriesAtZeroRpm(entries);
var delaunayMap = new DelaunayMap("ElectricMotorEfficiencyMap Mechanical to Electric");
var retVal = new EfficiencyMapNew(delaunayMap);
......
......@@ -182,21 +182,33 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
var prev = orderedBuckets[i - 1];
var next = orderedBuckets[i + 1];
//Drive
if (current.Value.MinBy(x => x.Torque).Torque / prev.Value.MinBy(x => x.Torque).Torque < ignoreThreshold
&&
current.Value.MinBy(x => x.Torque).Torque / next.Value.MinBy(x => x.Torque).Torque < ignoreThreshold) {
if (prev.Value.MinBy(x => x.Torque).Torque.IsEqual(0) || next.Value.MinBy(x => x.Torque).Torque.IsEqual(0)) {
ignoredSpeedBucketsDrive.Add(current.Key);
} else {
if (current.Value.MinBy(x => x.Torque).Torque / prev.Value.MinBy(x => x.Torque).Torque <
ignoreThreshold
&&
current.Value.MinBy(x => x.Torque).Torque / next.Value.MinBy(x => x.Torque).Torque <
ignoreThreshold) {
ignoredSpeedBucketsDrive.Add(current.Key);
}
}
//Recuperation
if (current.Value.MaxBy(x => x.Torque).Torque / prev.Value.MaxBy(x => x.Torque).Torque < ignoreThreshold
&&
current.Value.MaxBy(x => x.Torque).Torque / next.Value.MaxBy(x => x.Torque).Torque < ignoreThreshold)
{
//Recuperation
if (prev.Value.MaxBy(x => x.Torque).Torque.IsEqual(0) || next.Value.MaxBy(x => x.Torque).Torque.IsEqual(0)) {
ignoredSpeedBucketsRecuperation.Add(current.Key);
} else {
if (current.Value.MaxBy(x => x.Torque).Torque / prev.Value.MaxBy(x => x.Torque).Torque <
ignoreThreshold
&&
current.Value.MaxBy(x => x.Torque).Torque / next.Value.MaxBy(x => x.Torque).Torque <
ignoreThreshold) {
ignoredSpeedBucketsRecuperation.Add(current.Key);
}
}
}
}
......@@ -211,8 +223,8 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
var maxRecuperationEntry = speedBucket.Value.MaxBy(x => x.Torque);
var maxDriveEntry = speedBucket.Value.MinBy(x => x.Torque); //drive torque < 0
var recuperationFactor = maxTargetTorque / maxRecuperationEntry.Torque;
var driveFactor = minTargetTorque / maxDriveEntry.Torque;
var recuperationFactor = maxRecuperationEntry.Torque.IsEqual(0) ? 1.0 : maxTargetTorque / maxRecuperationEntry.Torque;
var driveFactor = maxDriveEntry.Torque.IsEqual(0) ? 1.0 : minTargetTorque / maxDriveEntry.Torque;
//Recuperation
if (!recuperationFactor.IsSmallerOrEqual(1) && !ignoredSpeedBucketsRecuperation.Contains(speedBucket.Key)) {
......@@ -251,7 +263,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
return entries;
}
private static Scalar CalculateExtrapolationFactor(Scalar targetFactor, int currentStep,
private static double CalculateExtrapolationFactor(double targetFactor, int currentStep,
uint nrOfSteps)
{
if (currentStep < 1) {
......@@ -272,7 +284,15 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
internal static IList<EfficiencyMap.Entry> GetEntries(DataTable data, double ratio)
{
return (from DataRow row in data.Rows select CreateEntry(row, ratio)).ToList();
var entries = (from DataRow row in data.Rows select CreateEntry(row, ratio)).OrderBy(x => x.MotorSpeed)
.ThenBy(x => x.Torque).ToList();
var duplicates = entries.GroupBy(x => Tuple.Create(x.MotorSpeed, x.Torque)).Where(g => g.Count() > 1).Select(x => x.Key).ToList();
if (duplicates.Count > 0) {
throw new VectoException("Duplicate entries in IEPC power map: {0}", duplicates.Select(x => $"{x.Item1.AsRPM / ratio} rpm / {x.Item2 * ratio}").Join());
}
return entries;
}
private static bool HeaderIsValid(DataColumnCollection columns)
......
......@@ -293,8 +293,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
});
}
voltageLevels.First().Voltage = 1.SI<Volt>();
voltageLevels.Last().Voltage = 10E9.SI<Volt>();
//voltageLevels.First().Voltage = 1.SI<Volt>();
//voltageLevels.Last().Voltage = 10E9.SI<Volt>();
var dragCurves = new Dictionary<uint, DragCurve>();
......
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