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

Skip to content
Snippets Groups Projects
Commit 75121f37 authored by Markus QUARITSCH's avatar Markus QUARITSCH
Browse files

electric motor efficiency map: adding fallback search when interpolate search...

electric motor efficiency map: adding fallback search when interpolate search leads to an operating point beyond the limits. issue line-search in this case
parent 85efc01a
No related branches found
No related tags found
No related merge requests found
......@@ -150,35 +150,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor
}
try {
var retVal = SearchAlgorithm.Search(
maxEmTorque, elPowerMaxEM.ElectricalPower - batPower,
-maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1),
getYValue: x => {
var myX = (EfficiencyResult)x;
return myX.ElectricalPower - batPower;
},
evaluateFunction: x => LookupElectricPower(avgSpeed, x, true),
criterion: x => {
var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower).Value();
},
searcher: this);
var retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM);
var tmp = LookupElectricPower(avgSpeed, retVal, true);
if (VectoMath.Abs(tmp.ElectricalPower - batPower).IsGreater(Constants.SimulationSettings.InterpolateSearchTolerance)) {
// searched operating point is not accurate enough...
retVal = SearchAlgorithm.Search(
maxEmTorque, elPowerMaxEM.ElectricalPower - batPower,
-maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1),
getYValue: x => {
var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower) * 1e3;
},
evaluateFunction: x => LookupElectricPower(avgSpeed, x, true),
criterion: x => {
var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower).Value() * 1e3;
},
searcher: this);
retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM, 1e3);
}
if (maxEmTorque < 0) {
// propelling
if (retVal.IsSmaller(maxEmTorque)) {
retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM, 1e3, true);
}
} else {
// recuperating
if (retVal.IsGreater(maxEmTorque)) {
retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM, 1e3, true);
}
}
return retVal;
} catch (VectoSearchFailedException vsfe) {
......@@ -188,6 +176,26 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor
return null;
}
private NewtonMeter SearchTorqueForElectricPower(Watt batPower, PerSecond avgSpeed, NewtonMeter maxEmTorque,
EfficiencyResult elPowerMaxEM, double factor = 1.0, bool forceLinesearch = false)
{
var retVal = SearchAlgorithm.Search(
maxEmTorque, elPowerMaxEM.ElectricalPower - batPower,
-maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1),
getYValue: x => {
var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower) * factor;
},
evaluateFunction: x => LookupElectricPower(avgSpeed, x, true),
criterion: x => {
var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower).Value() * factor;
},
searcher: this,
forceLineSearch: forceLinesearch);
return retVal;
}
public PerSecond MaxSpeed
{
get { return _maxSpeed ?? (_maxSpeed = _efficiencyMapMech2El.Entries.Select(x => x.Y).Max().SI<PerSecond>()); }
......
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