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 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
Branches
Tags
No related merge requests found
...@@ -150,42 +150,50 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor ...@@ -150,42 +150,50 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor
} }
try { try {
var retVal = SearchAlgorithm.Search( var retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM);
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 tmp = LookupElectricPower(avgSpeed, retVal, true); var tmp = LookupElectricPower(avgSpeed, retVal, true);
if (VectoMath.Abs(tmp.ElectricalPower - batPower).IsGreater(Constants.SimulationSettings.InterpolateSearchTolerance)) { if (VectoMath.Abs(tmp.ElectricalPower - batPower).IsGreater(Constants.SimulationSettings.InterpolateSearchTolerance)) {
// searched operating point is not accurate enough... // searched operating point is not accurate enough...
retVal = SearchAlgorithm.Search( 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) {
Log.Error("Failed to find mechanic power for given electric power! n_avg: {0} P_el: {1}; {2}", avgSpeed.AsRPM, batPower, vsfe.Message);
}
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, elPowerMaxEM.ElectricalPower - batPower,
-maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1), -maxEmTorque * 0.1 * (maxEmTorque > 0 ? -1 : 1),
getYValue: x => { getYValue: x => {
var myX = (EfficiencyResult)x; var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower) * 1e3; return (myX.ElectricalPower - batPower) * factor;
}, },
evaluateFunction: x => LookupElectricPower(avgSpeed, x, true), evaluateFunction: x => LookupElectricPower(avgSpeed, x, true),
criterion: x => { criterion: x => {
var myX = (EfficiencyResult)x; var myX = (EfficiencyResult)x;
return (myX.ElectricalPower - batPower).Value() * 1e3; return (myX.ElectricalPower - batPower).Value() * factor;
}, },
searcher: this); searcher: this,
} forceLineSearch: forceLinesearch);
return retVal; return retVal;
} catch (VectoSearchFailedException vsfe) {
Log.Error("Failed to find mechanic power for given electric power! n_avg: {0} P_el: {1}; {2}", avgSpeed.AsRPM, batPower, vsfe.Message);
}
return null;
} }
public PerSecond MaxSpeed public PerSecond MaxSpeed
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment