diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs index bbc64f3d864745d28ce064917ec056179fc41745..2acbfd927794d80dc9eab4d117318941f1b08d6e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/FuelConsumptionMap.cs @@ -32,6 +32,7 @@ using System; using System.ComponentModel.DataAnnotations; using System.Data; +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using TUGraz.VectoCommon.Exceptions; @@ -53,18 +54,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine /// <summary> /// Calculates the fuel consumption based on the given fuel map, the angularVelocity and the torque. /// </summary> - public KilogramPerSecond GetFuelConsumption(NewtonMeter torque, PerSecond angularVelocity, + public FuelConsumptionResult GetFuelConsumption(NewtonMeter torque, PerSecond angularVelocity, bool allowExtrapolation = false) { + var result = new FuelConsumptionResult(); // delaunay map needs is initialised with rpm, therefore the angularVelocity has to be converted. var value = _fuelMap.Interpolate(torque.Value(), angularVelocity.AsRPM); if (value.HasValue) { - return value.Value.SI().Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>(); + result.Value = value.Value.SI().Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>(); + return result; } if (allowExtrapolation) { - return + result.Value = _fuelMap.Extrapolate(torque.Value(), angularVelocity.AsRPM).SI().Kilo.Gramm.Per.Second.Cast<KilogramPerSecond>(); + result.Extrapolated = true; + return result; } throw new VectoException("FuelConsumptionMap: Interpolation failed. torque: {0}, n: {1}", torque.Value(), @@ -125,6 +130,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine #endregion } + [DebuggerDisplay("{Value} (extrapolated: {Extrapolated})")] + public class FuelConsumptionResult + { + public KilogramPerSecond Value; + public bool Extrapolated; + } + #region Equality members protected bool Equals(FuelConsumptionMap other) diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs index c4aed9a98105c0b48518f2a7343005aa51cf94e5..7a83449f43ce8599eb55edf164ff4fb60f5c9264 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs @@ -275,7 +275,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public KilogramPerSecond GetFuelConsumption(NewtonMeter torque, PerSecond angularVelocity) { - return FcMap.GetFuelConsumption(torque, angularVelocity, AllowExtrapolation); + return FcMap.GetFuelConsumption(torque, angularVelocity, AllowExtrapolation).Value; } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index 5cfd09c19c34a7a91fe21b230dc70d227e770c85..f058ce1e323d1c757cd178ddde816627e8b47cb5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -344,8 +344,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl container[ModalResultField.Tq_full] = CurrentState.DynamicFullLoadTorque; container[ModalResultField.Tq_drag] = CurrentState.FullDragTorque; - var fc = ModelData.ConsumptionMap.GetFuelConsumption(CurrentState.EngineTorque, avgEngineSpeed); + var result = ModelData.ConsumptionMap.GetFuelConsumption(CurrentState.EngineTorque, avgEngineSpeed, + DataBus.ExecutionMode != ExecutionMode.Declaration); + if (DataBus.ExecutionMode != ExecutionMode.Declaration && result.Extrapolated) { + Log.Warn("FuelConsumptionMap was extrapolated: range for FC-Map is not sufficient: n: {0}, torque: {2}", + avgEngineSpeed.Value(), CurrentState.EngineTorque.Value()); + } + var fc = result.Value; //TODO mk-2015-11-11: calculate aux start stop correction var fcAux = fc; diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs index 517e1508d52182d4d5219d20b8f2ceef89f43b1d..fc7427d407122e083bdffc46b40528ea31905514 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/FuelConsumptionMapTest.cs @@ -66,7 +66,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData var entry = lines[i].Split(',').Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray(); Assert.AreEqual(entry[2].SI().Gramm.Per.Hour.ConvertTo().Kilo.Gramm.Per.Second.Value(), - map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value(), Tolerance); + map.GetFuelConsumption(entry[1].SI<NewtonMeter>(), entry[0].RPMtoRad(), true).Value.Value(), Tolerance); } } }