Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

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