From 75121f373e4eca23073e035df4f4e33cebc8c22e Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 4 Aug 2022 10:36:05 +0200 Subject: [PATCH] electric motor efficiency map: adding fallback search when interpolate search leads to an operating point beyond the limits. issue line-search in this case --- .../Data/ElectricMotor/EfficiencyMap.cs | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs index f61e127a71..54baf78c9e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/EfficiencyMap.cs @@ -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>()); } -- GitLab