diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs index c89a11e460e15954cc7312fdf3b4eec8d17b48b0..5f3cf7cedbc5609949a9c47d17ecb8d2242573f3 100644 --- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs +++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs @@ -78,9 +78,10 @@ namespace TUGraz.VectoCore.Models.Declaration } engine.FullLoadCurves = fullLoadCurves; - - var fuel = GetCombustionEngineFuelData(primaryVehicle.Components.EngineInputData.EngineModes[modeIdx], fullLoadCurves[0], mission); + var engineMode = primaryVehicle.Components.EngineInputData.EngineModes[modeIdx]; + var fuel = GetCombustionEngineFuelData(engineMode.Fuels, + VectoMath.Max(engineMode.IdleSpeed, primaryVehicle.EngineIdleSpeed), fullLoadCurves[0], mission); @@ -91,10 +92,10 @@ namespace TUGraz.VectoCore.Models.Declaration } - private bool UseDieselFuel(IEngineModeDeclarationInputData engineMode) + private bool UseDieselFuel(IList<IEngineFuelDelcarationInputData> fuels) { - var fuelType = engineMode.Fuels.First().FuelType; - var isDualFuel = engineMode.Fuels.Count > 1; + var fuelType = fuels.First().FuelType; + var isDualFuel = fuels.Count > 1; if (isDualFuel) return true; @@ -109,32 +110,28 @@ namespace TUGraz.VectoCore.Models.Declaration } } - private string GetEngineRessourceId(IEngineModeDeclarationInputData engineMode) + private string GetEngineRessourceId(IList<IEngineFuelDelcarationInputData> fuels) { - return UseDieselFuel(engineMode) ? GenericEngineCM_Normed_CI : GenericEngineCM_Normed_PI; + return UseDieselFuel(fuels) ? GenericEngineCM_Normed_CI : GenericEngineCM_Normed_PI; } - private IFuelProperties GetFuelData(IEngineModeDeclarationInputData engineMode) + private IFuelProperties GetFuelData(IList<IEngineFuelDelcarationInputData> fuels) { - return UseDieselFuel(engineMode) + return UseDieselFuel(fuels) ? FuelData.Diesel : FuelData.Instance().Lookup(FuelType.NGPI, TankSystem.Compressed); } - private double[] GetEngineCorrectionFactors(IEngineModeDeclarationInputData engineMode) + private double[] GetEngineCorrectionFactors(IList<IEngineFuelDelcarationInputData> fuels) { - return UseDieselFuel(engineMode) ? DieselCIFactors : PIFactors; + return UseDieselFuel(fuels) ? DieselCIFactors : PIFactors; } - private CombustionEngineFuelData GetCombustionEngineFuelData(IEngineModeDeclarationInputData engineMode, EngineFullLoadCurve fullLoadCurve, Mission mission) + private CombustionEngineFuelData GetCombustionEngineFuelData(IList<IEngineFuelDelcarationInputData> fuels, PerSecond idleSpeed, EngineFullLoadCurve fullLoadCurve, Mission mission) { - var ressourceId = GetEngineRessourceId(engineMode); + var ressourceId = GetEngineRessourceId(fuels); - var nIdle = engineMode.IdleSpeed.AsRPM; - var n95h = fullLoadCurve.N95hSpeed.AsRPM; - var ratedPower = fullLoadCurve.MaxPower.Value(); - - var denormalizedData = DenormalizeData(ressourceId, nIdle, n95h, ratedPower); + var denormalizedData = DenormalizeData(ressourceId, idleSpeed, fullLoadCurve.N95hSpeed, fullLoadCurve.MaxPower); var engineSpeed = denormalizedData.AsEnumerable().Select(r => r.Field<string>(FuelConsumptionMapReader.Fields.EngineSpeed).ToDouble()).ToArray(); @@ -158,7 +155,7 @@ namespace TUGraz.VectoCore.Models.Declaration ; var fcMap = FuelConsumptionMapReader.Create(denormalizedData.AsEnumerable().OrderBy(r => r.Field<string>(FuelConsumptionMapReader.Fields.EngineSpeed).ToDouble()) .ThenBy(r => r.Field<string>(FuelConsumptionMapReader.Fields.Torque).ToDouble()).CopyToDataTable()); - var engineCF = GetEngineCorrectionFactors(engineMode); + var engineCF = GetEngineCorrectionFactors(fuels); var fuel = new CombustionEngineFuelData { @@ -168,7 +165,7 @@ namespace TUGraz.VectoCore.Models.Declaration ColdHotCorrectionFactor = engineCF[3], CorrectionFactorRegPer = engineCF[4], ConsumptionMap = fcMap, - FuelData = GetFuelData(engineMode) + FuelData = GetFuelData(fuels) }; fuel.FuelConsumptionCorrectionFactor = DeclarationData.WHTCCorrection.Lookup( mission.MissionType.GetNonEMSMissionType(), fuel.WHTCRural, fuel.WHTCUrban, @@ -193,12 +190,12 @@ namespace TUGraz.VectoCore.Models.Declaration var engineSpeed = row.Field<double>("n_norm") * (n95h - nIdle) + nIdle; var pwr = row.Field<double>("P_norm") * ratedPower; var torque = pwr / engineSpeed; - var fc = row.Field<double>("FC_norm") * pwr; + var fc = (row.Field<double>("FC_norm").SI(Unit.SI.Gramm.Per.Hour.Per.Kilo.Watt) * pwr).Cast<KilogramPerSecond>(); var newRow = result.NewRow(); newRow[FuelConsumptionMapReader.Fields.EngineSpeed] = Math.Round(engineSpeed.AsRPM,2, MidpointRounding.AwayFromZero); newRow[FuelConsumptionMapReader.Fields.Torque] = Math.Round(torque.Value(), 2, MidpointRounding.AwayFromZero); - newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = Math.Round(fc, 2, MidpointRounding.AwayFromZero); + newRow[FuelConsumptionMapReader.Fields.FuelConsumption] = Math.Round(fc.ConvertToGrammPerHour().Value, 2, MidpointRounding.AwayFromZero); result.Rows.Add(newRow); }