From d9f1a17980401d6c2c05fa656381208223086a12 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Tue, 6 Aug 2019 14:44:43 +0200
Subject: [PATCH] adding correction for WHR power in vsum and declaration
 reports, adding whrtype to manufacturer report

---
 .../InputData/DeclarationInputData.cs         |  1 +
 VectoCommon/VectoCommon/Models/WHRType.cs     | 25 +++++++++++
 .../Resources/XMLNames.Designer.cs            |  9 ++++
 .../VectoCommon/Resources/XMLNames.resx       |  3 ++
 .../XMLEngineeringEngineDataProvider.cs       |  2 +
 .../AbstractSimulationDataAdapter.cs          |  3 +-
 .../Simulation/Data/ModalResultField.cs       |  2 +
 .../Data/CombustionEngineData.cs              |  2 +
 .../Impl/CombustionEngine.cs                  | 25 +++++++++--
 .../Impl/StopStartCombustionEngine.cs         | 13 ++++++
 .../OutputData/ModalDataContainer.cs          |  6 ++-
 .../OutputData/SummaryDataContainer.cs        | 23 ++++++++--
 .../OutputData/XML/XMLDeclarationReport.cs    | 17 ++++----
 .../OutputData/XML/XMLManufacturerReport.cs   |  3 +-
 VectoCore/VectoCore/VectoCore.csproj          |  1 +
 .../vehicle_sampleDualModeDualFuel.xml        | 42 ++++++++++++-------
 ...vehicle_sampleSingleModeSingleFuel_WHR.xml | 42 ++++++++++++-------
 17 files changed, 169 insertions(+), 50 deletions(-)
 create mode 100644 VectoCommon/VectoCommon/Models/WHRType.cs

diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 9e42e515e5..960cedf42b 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -493,6 +493,7 @@ namespace TUGraz.VectoCommon.InputData
 		NewtonMeter MaxTorqueDeclared { get; }
 
 		IList<IEngineModeDeclarationInputData> EngineModes { get; }
+		WHRType WHRType{ get; }
 	}
 
 	public interface IEngineModeDeclarationInputData
diff --git a/VectoCommon/VectoCommon/Models/WHRType.cs b/VectoCommon/VectoCommon/Models/WHRType.cs
new file mode 100644
index 0000000000..50e7da217b
--- /dev/null
+++ b/VectoCommon/VectoCommon/Models/WHRType.cs
@@ -0,0 +1,25 @@
+using System;
+
+namespace TUGraz.VectoCore.Models.Declaration {
+	public enum WHRType
+	{
+		None,
+		MechanicalOnly,
+		ElectricalOnly,
+		MechanicalAndElectrical
+	}
+
+	public static class WHRTypeHelper
+	{
+		public static string ToXMLFormat(this WHRType whrType)
+		{
+			switch (whrType) {
+				case WHRType.None: return "none";
+				case WHRType.MechanicalOnly: return "mechanical only";
+				case WHRType.ElectricalOnly: return "electrical only";
+				case WHRType.MechanicalAndElectrical: return "mechanical and electrical";
+				default: throw new ArgumentOutOfRangeException(nameof(whrType), whrType, null);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
index 70741f6c65..ce02aa990a 100644
--- a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
+++ b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
@@ -1212,6 +1212,15 @@ namespace TUGraz.VectoCommon.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to WHRType.
+        /// </summary>
+        public static string Engine_WHRType {
+            get {
+                return ResourceManager.GetString("Engine_WHRType", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to WHTCEngineering.
         /// </summary>
diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.resx b/VectoCommon/VectoCommon/Resources/XMLNames.resx
index 2ac518ece7..60c69fa803 100644
--- a/VectoCommon/VectoCommon/Resources/XMLNames.resx
+++ b/VectoCommon/VectoCommon/Resources/XMLNames.resx
@@ -1101,4 +1101,7 @@
   <data name="Engine_WHRCorrectionFactors_CFRegPer" xml:space="preserve">
     <value>CFRegPer</value>
   </data>
+  <data name="Engine_WHRType" xml:space="preserve">
+    <value>WHRType</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringEngineDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringEngineDataProvider.cs
index b99b975fdc..fe4d8e3273 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringEngineDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringEngineDataProvider.cs
@@ -40,6 +40,7 @@ using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.XML.Engineering.Interfaces;
+using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering.DataProvider
@@ -174,6 +175,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering.DataProvider
 		}
 
 		public virtual IList<IEngineModeDeclarationInputData> EngineModes { get { return new[] { this }.Cast<IEngineModeDeclarationInputData>().ToList(); } }
+		public virtual WHRType WHRType { get { return WHRType.None; } }
 
 		public virtual KilogramSquareMeter Inertia
 		{
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
index 03c485a0a0..14414140cf 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
@@ -138,7 +138,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				RatedSpeedDeclared = data.RatedSpeedDeclared,
 				MaxTorqueDeclared = data.MaxTorqueDeclared,
 				//FuelData = DeclarationData.FuelData.Lookup(data.FuelType, tankSystem)
-				MultipleEngineFuelModes = data.EngineModes.Count > 1
+				MultipleEngineFuelModes = data.EngineModes.Count > 1,
+				WHRType = data.WHRType,
 			};
 			return retVal;
 		}
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
index dcfcc0e0ff..7e52b4201a 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
@@ -332,6 +332,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 		[ModalResultField(typeof(SI), caption: "AA_TotalCycleFuelConsumptionCompressorOff [g]", outputFactor: 1000)] AA_TotalCycleFuelConsumptionCompressorOff,
 		[ModalResultField(typeof(SI), caption: "AA_TotalCycleFuelConsumptionCompressorOn [g]", outputFactor: 1000)] AA_TotalCycleFuelConsumptionCompressorOn,
 
+		[ModalResultField(typeof(SI), "P_WHR_el", outputFactor:1e-3)] P_WHR_el_map,
+		[ModalResultField(typeof(SI), "P_WHR_el_corr", outputFactor: 1e-3)] P_WHR_el_corr
 	}
 
 	[AttributeUsage(AttributeTargets.Field)]
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
index 511a9140aa..8097184063 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
@@ -73,6 +73,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 		public WHRData WHRData;
 
+		public WHRType WHRType;
+
 
 		// ReSharper disable once UnusedMember.Global -- used in CustomValidation
 		public static ValidationResult ValidateData(CombustionEngineData data, ValidationContext context)
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
index 8a9a495ebb..18b479edad 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
@@ -374,6 +374,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			container[ModalResultField.Tq_drag] = CurrentState.FullDragTorque;
 			container[ModalResultField.IgnitionOn] = CurrentState.IgnitionOn;
 
+			var pWHRelMap = 0.SI<Watt>();
+			var pWHRelCorr = 0.SI<Watt>();
+			if (ModelData.WHRData != null) {
+				var whrPwr = ModelData.WHRData.WHRMap.GetWHRPower(
+					CurrentState.EngineTorque, avgEngineSpeed, DataBus.ExecutionMode != ExecutionMode.Declaration);
+				if (DataBus.ExecutionMode != ExecutionMode.Declaration && whrPwr.Extrapolated) {
+					Log.Warn(
+						"Electric WHR power was extrapolated: range for WHR-Map is not sufficient: n: {0}, torque: {1}",
+						avgEngineSpeed.Value(), CurrentState.EngineTorque.Value());
+				}
+				pWHRelMap = whrPwr.ElectricPower;
+				pWHRelCorr = pWHRelMap * ModelData.WHRData.WHRCorrectionFactor;
+			} 
+
+			container[ModalResultField.P_WHR_el_map] = pWHRelMap;
+			container[ModalResultField.P_WHR_el_corr] = pWHRelCorr;
+
 			foreach (var fuel in ModelData.Fuels) {
 				var result = fuel.ConsumptionMap.GetFuelConsumption(
 					CurrentState.EngineTorque, avgEngineSpeed,
@@ -437,9 +454,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				throw new VectoException("ComputeFullLoadPower cannot compute for simulation interval length 0.");
 			}
 
-			CurrentState.StationaryFullLoadTorque =
-				ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularVelocity);
-			var stationaryFullLoadPower = CurrentState.StationaryFullLoadTorque * angularVelocity;
+			var tStatFull = ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(angularVelocity);
+			var stationaryFullLoadPower = tStatFull * angularVelocity;
+			if (!dryRun) {
+				CurrentState.StationaryFullLoadTorque = tStatFull;
+			}
 			Watt dynFullPowerCalculated;
 
 			// disable pt1 behaviour if PT1Disabled is true, or if the previous enginepower is greater than the current stationary fullload power (in this case the pt1 calculation fails)
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs
index 9a719eaba4..4538d008ed 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs
@@ -112,6 +112,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl {
 			container[ModalResultField.P_aux_ice_off] = (CurrentState.AuxPowerEngineOff ?? 0.SI<Watt>()) * EngineStopStartUtilityFactor;
 
 			var auxDemand = EngineAux.PowerDemandEngineOn(ModelData.IdleSpeed) / ModelData.IdleSpeed;
+
+			var pWHRelMap = 0.SI<Watt>();
+			var pWHRelCorr = 0.SI<Watt>();
+
+			if (ModelData.WHRData != null) {
+				var whrPwr = ModelData.WHRData.WHRMap.GetWHRPower(auxDemand, ModelData.IdleSpeed, DataBus.ExecutionMode != ExecutionMode.Declaration);
+
+				pWHRelMap = whrPwr.ElectricPower * (1 - EngineStopStartUtilityFactor);
+				pWHRelCorr = pWHRelMap * ModelData.WHRData.WHRCorrectionFactor;
+			}
+			container[ModalResultField.P_WHR_el_map] = pWHRelMap;
+			container[ModalResultField.P_WHR_el_corr] = pWHRelCorr;
+
 			foreach (var fuel in ModelData.Fuels) {
 				var fc = 0.SI<KilogramPerSecond>();
 				var fcNCVcorr = fc * fuel.FuelData.HeatingValueCorrection; // TODO: wird fcNCVcorr
diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
index 9d8b55c12a..f270c1dbbc 100644
--- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs
@@ -164,7 +164,11 @@ namespace TUGraz.VectoCore.OutputData
 
 			var strCols = dataColumns.Select(x => x.GetName())
 									.Concat(Auxiliaries.Values.Select(c => c.ColumnName))
-									.Concat(new[] { ModalResultField.P_aux_ice_off, ModalResultField.P_ice_start }.Select(x => x.GetName()))
+									.Concat(
+										new[] {
+											ModalResultField.P_WHR_el_map, ModalResultField.P_WHR_el_corr, ModalResultField.P_aux_ice_off,
+											ModalResultField.P_ice_start
+										}.Select(x => x.GetName()))
 									.Concat(FuelColumns.SelectMany(kv => kv.Value.Select(kv2 => kv2.Value.ColumnName)));
 
 #if TRACE
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index ca44352f24..7ea53103e5 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -135,6 +135,9 @@ namespace TUGraz.VectoCore.OutputData
 		public const string FCESS_KM = "FC-ESS{0} [g/km]";
 		public const string FCESS_H_CORR = "FC-ESS_Corr{0} [g/h]";
 		public const string FCESS_KM_CORR = "FC-ESS_Corr{0} [g/km]";
+		public const string FCWHR_H_CORR = "FC-WHR_Corr{0} [g/h]";
+		public const string FCWHR_KM_CORR = "FC-WHR_Corr{0} [g/km]";
+
 
 		public const string FCFINAL_H = "FC-Final{0} [g/h]";
 		public const string FCFINAL_KM = "FC-Final{0} [g/km]";
@@ -158,6 +161,9 @@ namespace TUGraz.VectoCore.OutputData
 		public const string NUM_ICE_STARTS = "ice_starts [-]";
 		public const string K_VEHLINE = "k_vehline{0} [g/kWh]";
 
+		public const string E_WHR_EL = "E_WHR_el [kWh]";
+
+
 		public const string E_AIR = "E_air [kWh]";
 		public const string E_ROLL = "E_roll [kWh]";
 		public const string E_GRAD = "E_grad [kWh]";
@@ -250,6 +256,7 @@ namespace TUGraz.VectoCore.OutputData
 			FCWHTCC_H, FCWHTCC_KM,
 			FCAAUX_H, FCAAUX_KM,
 			FCESS_H, FCESS_KM,
+			FCWHR_H_CORR, FCWHR_KM_CORR,
 			FCESS_H_CORR, FCESS_KM_CORR,
 			FCFINAL_H, FCFINAL_KM,
 			FCFINAL_LITERPER100KM, FCFINAL_LITERPER100TKM, FCFINAL_LiterPer100M3KM,
@@ -367,7 +374,7 @@ namespace TUGraz.VectoCore.OutputData
 					E_FCMAP_POS, E_FCMAP_NEG, E_POWERTRAIN_INERTIA,
 					E_AUX, E_CLUTCH_LOSS, E_TC_LOSS, E_SHIFT_LOSS, E_GBX_LOSS,
 					E_RET_LOSS, E_ANGLE_LOSS, E_AXL_LOSS, E_BRAKE, E_VEHICLE_INERTIA, E_WHEEL, E_AIR, E_ROLL, E_GRAD,
-					E_AUX_ESS_MECH, E_ICE_START, NUM_ICE_STARTS, 
+					E_WHR_EL, E_AUX_ESS_MECH, E_ICE_START, NUM_ICE_STARTS, 
 					ACC, ACC_POS, ACC_NEG, ACC_TIMESHARE, DEC_TIMESHARE, CRUISE_TIMESHARE,
 					MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS,
 					STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE
@@ -516,12 +523,19 @@ namespace TUGraz.VectoCore.OutputData
 			IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, 
 			CubicMeter cargoVolume, bool multipleEngineModes, bool vtpCycle)
 		{
-			var workESS = modData.TimeIntegral<WattSecond>(ModalResultField.P_aux_ice_off);
+			var workESS = modData.WorkAuxiliariesDuringEngineStop() +
+						modData.WorkEngineStart();
+
+			var workWHREl = modData.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr);
+			var workWhrMech = - workWHREl / DeclarationData.AlternaterEfficiency;
+
 			var distance = modData.Distance();
 			var duration = modData.Duration();
 
 			var kilogramCO2PerMeter = 0.SI<KilogramPerMeter>();
 
+			row[E_WHR_EL] = workWHREl.ConvertToKiloWattHour();
+
 			foreach (var fuel in modData.FuelData) {
 				var suffix = modData.FuelData.Count <= 1 && !multipleEngineModes ? "" : "_" + fuel.FuelType.GetLabel();
 
@@ -566,15 +580,18 @@ namespace TUGraz.VectoCore.OutputData
 
 				row[FcCol(K_VEHLINE, suffix)] = correction.ConvertToGramPerKiloWattHour();
 
-				var fcEssCorr = fcModSum + correction * workESS;
+				var fcWHRCorr = fcModSum + correction * workWhrMech;
+				var fcEssCorr = fcWHRCorr + correction * workESS;
 
 				row[FcCol(FCESS_H_CORR, suffix)] = duration != null ? (fcEssCorr / duration).ConvertToGrammPerHour() : null;
+				row[FcCol(FCWHR_H_CORR, suffix)] = duration != null ? (fcWHRCorr / duration).ConvertToGrammPerHour() : null;
 
 				var fcFinal = fcEssCorr;
 
 				row[FcCol(FCFINAL_H, suffix)] = (fcFinal / duration).ConvertToGrammPerHour();
 
 				if (distance != null && distance.IsGreater(0)) {
+					row[FcCol(FCWHR_KM_CORR, suffix)] = (fcWHRCorr / distance).ConvertToGrammPerKiloMeter();
 					row[FcCol(FCESS_KM_CORR, suffix)] = (fcEssCorr / distance).ConvertToGrammPerKiloMeter();
 					row[FcCol(FCFINAL_KM, suffix)] = (fcFinal / distance).ConvertToGrammPerKiloMeter();
 
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
index 256a37cbeb..9ccb650719 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs
@@ -116,11 +116,6 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 			public virtual void SetResultData(VectoRunData runData, IModalDataContainer data, double weightingFactor)
 			{
-				//FuelData = data.FuelData;
-				
-				//Payload = runData.VehicleData.Loading;
-				//CargoVolume = runData.VehicleData.CargoVolume;
-				//TotalVehicleWeight = runData.VehicleData.TotalVehicleWeight;
 				Status = data.RunStatus;
 				Error = data.Error;
 				StackTrace = data.StackTrace;
@@ -147,7 +142,10 @@ namespace TUGraz.VectoCore.OutputData.XML
 				EngineSpeedDrivingMax = entriesDriving.Max(x => x.nEng);
 				Distance = data.Distance();
 
-				var workESS = data.TimeIntegral<WattSecond>(ModalResultField.P_aux_ice_off);
+				var workESS = data.WorkAuxiliariesDuringEngineStop() + data.WorkEngineStart();
+				var workWHRel = data.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr);
+				var workWhrMech = -workWHRel / DeclarationData.AlternaterEfficiency;
+
 				FuelConsumptionFinal = new Dictionary<FuelType, Kilogram>();
 				CO2Total = 0.SI<Kilogram>();
 				EnergyConsumptionTotal = 0.SI<Joule>();
@@ -163,9 +161,10 @@ namespace TUGraz.VectoCore.OutputData.XML
 								x.Field<SI>(ModalResultField.P_eng_fcmap.GetName()).Value(), x.Field<SI>(data.GetColumnName(entry, ModalResultField.FCFinal)).Value()) : null).Where(x => x != null && x.Y > 0),
 						out k, out d, out s);
 					var correction = k.SI<KilogramPerWattSecond>();
-					FuelConsumptionFinal[entry.FuelType] = fcSum + correction * workESS;
-					CO2Total += fcSum * entry.CO2PerFuelWeight;
-					EnergyConsumptionTotal += fcSum * entry.LowerHeatingValueVecto;
+					var fcTotalcorr = fcSum + correction * (workESS + workWhrMech);
+					FuelConsumptionFinal[entry.FuelType] = fcTotalcorr;
+					CO2Total += fcTotalcorr * entry.CO2PerFuelWeight;
+					EnergyConsumptionTotal += fcTotalcorr * entry.LowerHeatingValueVecto;
 				}
 				
 				var gbxOutSignal = runData.Retarder.Type == RetarderType.TransmissionOutputRetarder
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
index 0d89719410..58ea0ac5ca 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
@@ -182,7 +182,8 @@ namespace TUGraz.VectoCore.OutputData.XML
 				new XElement(tns + XMLNames.Engine_RatedPower, XMLHelper.ValueAsUnit(engineData.RatedPowerDeclared, XMLNames.Unit_kW)),
 				new XElement(tns + XMLNames.Engine_IdlingSpeed, XMLHelper.ValueAsUnit(engineData.IdleSpeed, XMLNames.Unit_RPM)),
 				new XElement(tns + XMLNames.Engine_RatedSpeed, XMLHelper.ValueAsUnit(engineData.RatedSpeedDeclared, XMLNames.Unit_RPM)),
-				new XElement(tns + XMLNames.Engine_Displacement, XMLHelper.ValueAsUnit(engineData.Displacement, XMLNames.Unit_ltr, 1)),				
+				new XElement(tns + XMLNames.Engine_Displacement, XMLHelper.ValueAsUnit(engineData.Displacement, XMLNames.Unit_ltr, 1)),	
+				new XElement(tns + XMLNames.Engine_WHRType, engineData.WHRType.ToXMLFormat()),			
 				fuelModes.Select(x => new XElement(tns + XMLNames.Report_Engine_FuelMode, x.Select(f => new XElement(tns + XMLNames.Engine_FuelType, f.FuelType.ToXMLFormat()))))
 				);
 		}
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index e2ff058383..a11f39c61d 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -254,6 +254,7 @@
     <Compile Include="InputData\FileIO\XML\Declaration\IXMLDeclarationInputDataReader.cs" />
     <Compile Include="InputData\FileIO\XML\IXMLInputDataReader.cs" />
     <Compile Include="InputData\FileIO\XML\XMLInputDataNinjectModule.cs" />
+    <Compile Include="Models\Declaration\WHRType.cs" />
     <Compile Include="Models\SimulationComponent\Data\Engine\WHRPowerMap.cs" />
     <Compile Include="InputData\Reader\ComponentData\WHRPowerReader.cs" />
     <Compile Include="Models\SimulationComponent\Impl\StopStartCombustionEngine.cs" />
diff --git a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleDualModeDualFuel.xml b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleDualModeDualFuel.xml
index b36f5a4de3..580269b354 100644
--- a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleDualModeDualFuel.xml
+++ b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleDualModeDualFuel.xml
@@ -5,11 +5,12 @@
 	xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0"
 	xmlns:v1.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0"
 	xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0"
+	xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1"
 	xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3_DF"
 	xmlns:di="http://www.w3.org/2000/09/xmldsig#"
 	xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob E:\QUAM\Workspace\VECTO_FurtherDev\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd"
 	>
-	<Vehicle id="VEH-1234567890" xsi:type="VehicleDeclarationType">
+	<v2.0:Vehicle id="VEH-1234567890" xsi:type="VehicleDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1">
 		<Manufacturer>Generic Truck Manufacturer</Manufacturer>
 		<ManufacturerAddress>Street, ZIP City</ManufacturerAddress>
 		<Model>Generic Model</Model>
@@ -24,17 +25,26 @@
 		<RetarderType>Transmission Output Retarder</RetarderType>
 		<RetarderRatio>1.000</RetarderRatio>
 		<AngledriveType>None</AngledriveType>
-		<PTO xsi:type="PTOType">
+		<v2.1:PTO xsi:type="PTOType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 			<PTOShaftsGearWheels>only the drive shaft of the PTO</PTOShaftsGearWheels>
 			<PTOOtherElements>multi-disc clutch</PTOOtherElements>
-		</PTO>
-		<TorqueLimits xsi:type="TorqueLimitsType">
+		</v2.1:PTO>
+		<ZeroEmissionVehicle>false</ZeroEmissionVehicle>
+		<VocationalVehicle>false</VocationalVehicle>
+		<SleeperCab>false</SleeperCab>
+		<v2.1:ADAS xsi:type="AdvancedDriverAssistantSystemsType">
+			<EngineStopStart>true</EngineStopStart>
+			<EcoRollWithoutEngineStop>false</EcoRollWithoutEngineStop>
+			<EcoRollWithEngineStop>false</EcoRollWithEngineStop>
+			<PredictiveCruiseControl>none</PredictiveCruiseControl>
+		</v2.1:ADAS>
+		<v2.1:TorqueLimits xsi:type="TorqueLimitsType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 			<Entry gear="6" maxTorque="1800" />
 			<Entry gear="1" maxTorque="2500" />
 			<Entry gear="12" maxTorque="1900" />
-		</TorqueLimits>
-		<Components xsi:type="VehicleComponentsType">
-			<Engine>
+		</v2.1:TorqueLimits>
+		<Components xsi:type="v2.0:VehicleComponentsType">
+			<Engine xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="EngineComponentDeclarationType">
 				<v2.0:Data id="ENG-gooZah3D" xsi:type="v2.3:EngineDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3_DF">
 					<Manufacturer>Generic Engine Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck Engine</Model>
@@ -454,7 +464,7 @@
 					</di:Reference>
 				</Signature>
 			</Engine>
-			<Gearbox>
+			<Gearbox xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="GearboxComponentDeclarationType">
 				<v2.0:Data id="gbx-vi2Oak2N" xsi:type="v2.0:GearboxDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck Gearbox</Model>
@@ -2854,7 +2864,7 @@
 					</di:Reference>
 				</Signature>
 				</Gearbox>
-			<TorqueConverter>
+			<TorqueConverter xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="TorqueConverterComponentDeclarationType">
 				<Data id="tc-123xyz" xsi:type="v2.0:TorqueConverterDataDeclarationType">
 					<v2.0:Manufacturer>Some Manufacturer</v2.0:Manufacturer>
 					<v2.0:Model>Some Model</v2.0:Model>
@@ -2875,7 +2885,7 @@
 					</di:Reference>
 				</Signature>
 			</TorqueConverter>
-			<Angledrive>
+			<Angledrive xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AngledriveComponentDeclarationType">
 				<v2.0:Data id="agl-vi2Oak2N" xsi:type="v2.0:AngledriveDataDeclarationType"  xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck Gearbox</Model>
@@ -2904,7 +2914,7 @@
 					</di:Reference>
 				</Signature>
 			</Angledrive>
-			<Retarder>
+			<Retarder xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="RetarderComponentDeclarationType">
 				<v2.0:Data id="RET-Shai9imi" xsi:type="v2.0:RetarderDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 					<Manufacturer>Generic Retarder Manufacturer</Manufacturer>
 					<Model>Generic Retarder</Model>
@@ -2950,7 +2960,7 @@
 					</di:Reference>
 				</Signature>
 			</Retarder>
-			<Axlegear>
+			<Axlegear xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AxlegearComponentDeclarationType">
 				<v2.0:Data id="AXL-EC3ohnoh" xsi:type="v1.0:AxlegearDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck AxleGear</Model>
@@ -3466,7 +3476,7 @@
 					</di:Reference>
 				</Signature>
 			</Axlegear>
-			<AxleWheels>
+			<AxleWheels xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AxleWheelsComponentDeclarationType">
 				<Data xsi:type="AxleWheelsDataDeclarationType">
 					<Axles>
 						<Axle axleNumber="1" xsi:type="AxleDataDeclarationType">
@@ -3526,7 +3536,7 @@
 					</Axles>
 				</Data>
 			</AxleWheels>
-			<Auxiliaries>
+			<Auxiliaries xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AuxiliariesComponentDeclarationType">
 				<Data xsi:type="AuxiliariesDataDeclarationType">
 					<Fan>
 						<Technology>Hydraulic driven - Constant displacement pump</Technology>
@@ -3545,7 +3555,7 @@
 					</HVAC>
 				</Data>
 			</Auxiliaries>
-			<AirDrag>
+			<AirDrag xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AirDragComponentDeclarationType">
 				<Data id="CabinX23h" xsi:type="AirDragDataDeclarationType">
 					<Manufacturer>Generic Manufacturer</Manufacturer>
 					<Model>Generic Model</Model>
@@ -3568,5 +3578,5 @@
 				</Signature>
 			</AirDrag>
 		</Components>
-	</Vehicle>
+	</v2.0:Vehicle>
 </tns:VectoInputDeclaration>
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleSingleModeSingleFuel_WHR.xml b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleSingleModeSingleFuel_WHR.xml
index 27c1ad3bbd..208680fe55 100644
--- a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleSingleModeSingleFuel_WHR.xml
+++ b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.3/vehicle_sampleSingleModeSingleFuel_WHR.xml
@@ -5,11 +5,12 @@
 	xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0"
 	xmlns:v1.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0"
 	xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0"
+	xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1"
 	xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3_DF"
 	xmlns:di="http://www.w3.org/2000/09/xmldsig#"
 	xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob E:\QUAM\Workspace\VECTO_FurtherDev\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd"
 	>
-	<Vehicle id="VEH-1234567890" xsi:type="VehicleDeclarationType">
+	<v2.0:Vehicle id="VEH-1234567890" xsi:type="VehicleDeclarationType"  xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1">
 		<Manufacturer>Generic Truck Manufacturer</Manufacturer>
 		<ManufacturerAddress>Street, ZIP City</ManufacturerAddress>
 		<Model>Generic Model</Model>
@@ -24,17 +25,26 @@
 		<RetarderType>Transmission Output Retarder</RetarderType>
 		<RetarderRatio>1.000</RetarderRatio>
 		<AngledriveType>None</AngledriveType>
-		<PTO xsi:type="PTOType">
+		<v2.1:PTO xsi:type="PTOType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 			<PTOShaftsGearWheels>only the drive shaft of the PTO</PTOShaftsGearWheels>
 			<PTOOtherElements>multi-disc clutch</PTOOtherElements>
-		</PTO>
-		<TorqueLimits xsi:type="TorqueLimitsType">
+		</v2.1:PTO>
+		<ZeroEmissionVehicle>false</ZeroEmissionVehicle>
+		<VocationalVehicle>false</VocationalVehicle>
+		<SleeperCab>false</SleeperCab>
+		<v2.1:ADAS xsi:type="AdvancedDriverAssistantSystemsType">
+			<EngineStopStart>true</EngineStopStart>
+			<EcoRollWithoutEngineStop>false</EcoRollWithoutEngineStop>
+			<EcoRollWithEngineStop>false</EcoRollWithEngineStop>
+			<PredictiveCruiseControl>none</PredictiveCruiseControl>
+		</v2.1:ADAS>
+		<v2.1:TorqueLimits xsi:type="TorqueLimitsType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 			<Entry gear="6" maxTorque="1800" />
 			<Entry gear="1" maxTorque="2500" />
 			<Entry gear="12" maxTorque="1900" />
-		</TorqueLimits>
-		<Components xsi:type="VehicleComponentsType">
-			<Engine>
+		</v2.1:TorqueLimits>
+		<Components xsi:type="v2.0:VehicleComponentsType">
+			<Engine xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="EngineComponentDeclarationType">
 				<v2.0:Data id="ENG-gooZah3D" xsi:type="v2.3:EngineDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3_DF">
 					<Manufacturer>Generic Engine Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck Engine</Model>
@@ -202,7 +212,7 @@
 					</di:Reference>
 				</Signature>
 			</Engine>
-			<Gearbox>
+			<Gearbox xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="GearboxComponentDeclarationType">
 				<v2.0:Data id="gbx-vi2Oak2N" xsi:type="v2.0:GearboxDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck Gearbox</Model>
@@ -2602,7 +2612,7 @@
 					</di:Reference>
 				</Signature>
 				</Gearbox>
-			<TorqueConverter>
+			<TorqueConverter xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="TorqueConverterComponentDeclarationType">
 				<Data id="tc-123xyz" xsi:type="v2.0:TorqueConverterDataDeclarationType">
 					<v2.0:Manufacturer>Some Manufacturer</v2.0:Manufacturer>
 					<v2.0:Model>Some Model</v2.0:Model>
@@ -2623,7 +2633,7 @@
 					</di:Reference>
 				</Signature>
 			</TorqueConverter>
-			<Angledrive>
+			<Angledrive xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AngledriveComponentDeclarationType">
 				<v2.0:Data id="agl-vi2Oak2N" xsi:type="v2.0:AngledriveDataDeclarationType"  xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck Gearbox</Model>
@@ -2652,7 +2662,7 @@
 					</di:Reference>
 				</Signature>
 			</Angledrive>
-			<Retarder>
+			<Retarder xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="RetarderComponentDeclarationType">
 				<v2.0:Data id="RET-Shai9imi" xsi:type="v2.0:RetarderDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0">
 					<Manufacturer>Generic Retarder Manufacturer</Manufacturer>
 					<Model>Generic Retarder</Model>
@@ -2698,7 +2708,7 @@
 					</di:Reference>
 				</Signature>
 			</Retarder>
-			<Axlegear>
+			<Axlegear xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AxlegearComponentDeclarationType">
 				<v2.0:Data id="AXL-EC3ohnoh" xsi:type="v1.0:AxlegearDataDeclarationType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0">
 					<Manufacturer>Generic Gearbox Manufacturer</Manufacturer>
 					<Model>Generic 40t Long Haul Truck AxleGear</Model>
@@ -3214,7 +3224,7 @@
 					</di:Reference>
 				</Signature>
 			</Axlegear>
-			<AxleWheels>
+			<AxleWheels xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AxleWheelsComponentDeclarationType">
 				<Data xsi:type="AxleWheelsDataDeclarationType">
 					<Axles>
 						<Axle axleNumber="1" xsi:type="AxleDataDeclarationType">
@@ -3274,7 +3284,7 @@
 					</Axles>
 				</Data>
 			</AxleWheels>
-			<Auxiliaries>
+			<Auxiliaries xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AuxiliariesComponentDeclarationType">
 				<Data xsi:type="AuxiliariesDataDeclarationType">
 					<Fan>
 						<Technology>Hydraulic driven - Constant displacement pump</Technology>
@@ -3293,7 +3303,7 @@
 					</HVAC>
 				</Data>
 			</Auxiliaries>
-			<AirDrag>
+			<AirDrag xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="AirDragComponentDeclarationType">
 				<Data id="CabinX23h" xsi:type="AirDragDataDeclarationType">
 					<Manufacturer>Generic Manufacturer</Manufacturer>
 					<Model>Generic Model</Model>
@@ -3316,5 +3326,5 @@
 				</Signature>
 			</AirDrag>
 		</Components>
-	</Vehicle>
+	</v2.0:Vehicle>
 </tns:VectoInputDeclaration>
\ No newline at end of file
-- 
GitLab