From 07d9f8cac0fc06643a56f41e84f6753c57c0b807 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 25 May 2020 17:21:25 +0200
Subject: [PATCH] refactoring generic fuel data class

---
 .../GenericModelData/GenericBusEngineData.cs  | 41 +++++++++----------
 1 file changed, 19 insertions(+), 22 deletions(-)

diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusEngineData.cs
index c89a11e460..5f3cf7cedb 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);
 			}
 
-- 
GitLab