From 70cdf78c65d3f46f55043d24d33f40fd9aec8fce Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <quaritsch@ivt.tugraz.at>
Date: Wed, 18 Jan 2023 08:29:18 +0100
Subject: [PATCH] remove initialize method in gearbox that takes a gear as
 argument and issues a dry-run request with a different gear. this approach
 caused errors because the internal 'previous state' of components might be
 modified. instead, a separate simple test-powertrain is used to calculate the
 necessary values without altering the state of the actual powertrain

---
 .../SimulationComponent/Impl/APTNGearbox.cs   | 34 ----------
 .../SimulationComponent/Impl/Gearbox.cs       | 58 -----------------
 .../Impl/HybridController.cs                  | 62 +++++++++++++++++--
 .../SimulationComponent/Impl/PEVGearbox.cs    | 36 -----------
 .../Impl/Shiftstrategies/AMTShiftStrategy.cs  | 33 +++++++++-
 .../Shiftstrategies/PEVAMTShiftStrategy.cs    | 40 +++++++++---
 6 files changed, 119 insertions(+), 144 deletions(-)

diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs
index fd345f22f0..e2b03d87e9 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs
@@ -53,39 +53,5 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			return response;
 		}
 
-		protected internal override ResponseDryRun Initialize(Second absTime, GearshiftPosition gear,
-			NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			var oldGear = Gear;
-			Gear = gear;
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear.Gear].Ratio;
-			var torqueLossResult = ModelData.Gears[gear.Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-			CurrentState.TorqueLossResult = torqueLossResult;
-			var inTorque = outTorque / ModelData.Gears[gear.Gear].Ratio + torqueLossResult.Value;
-
-			if (!inAngularVelocity.IsEqual(0)) {
-				var alpha = ModelData.Inertia.IsEqual(0) ? 0.SI<PerSquareSecond>() : outTorque / ModelData.Inertia;
-				var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia, Constants.SimulationSettings.TargetTimeInterval);
-				inTorque += inertiaPowerLoss / inAngularVelocity;
-			}
-
-			var response = NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval, inTorque, inAngularVelocity, true);
-
-			var eMotor = DataBus.ElectricMotorInfo(DataBus.PowertrainInfo.ElectricMotorPositions[0]);
-			var fullLoad = -eMotor.MaxPowerDrive(DataBus.BatteryInfo.InternalVoltage, inAngularVelocity, gear);
-
-			Gear = oldGear;
-			return new ResponseDryRun(this, response) {
-				ElectricMotor = { PowerRequest = response.ElectricMotor.PowerRequest },
-				Gearbox = {
-					PowerRequest = outTorque * outAngularVelocity,
-					InputSpeed = inAngularVelocity,
-					InputTorque = inTorque,
-					OutputTorque = outTorque,
-					OutputSpeed = outAngularVelocity,
-				},
-				DeltaFullLoad = response.ElectricMotor.PowerRequest - fullLoad
-			};
-		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
index dce15f1907..fdba784629 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
@@ -135,64 +135,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public override bool TCLocked => true;
 
-		protected internal virtual ResponseDryRun Initialize(Second absTime, GearshiftPosition gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			var oldGear = Gear;
-			Gear = gear;
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear.Gear].Ratio;
-			var torqueLossResult = ModelData.Gears[gear.Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-			
-			CurrentState.TorqueLossResult = torqueLossResult;
-			var inTorque = outTorque / ModelData.Gears[gear.Gear].Ratio + torqueLossResult.Value;
-
-			if (DataBus.PowertrainInfo.ElectricMotorPositions.Any(x => x.IsOneOf(PowertrainPosition.HybridP2, PowertrainPosition.HybridP2_5))) {
-				// if there is an electric motor after the transmission, initialize the EM first
-				NextComponent.Initialize(inTorque, inAngularVelocity);
-			}
-
-			if (!inAngularVelocity.IsEqual(0)) {
-				var alpha = ModelData.Inertia.IsEqual(0)
-					? 0.SI<PerSquareSecond>()
-					: outTorque / ModelData.Inertia;
-
-				var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia,
-					Constants.SimulationSettings.TargetTimeInterval);
-				inTorque += inertiaPowerLoss / inAngularVelocity;
-			}
-
-			var response = NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval,
-				inTorque, inAngularVelocity, true);
-			//NextComponent.Initialize(inTorque, inAngularVelocity);
-			//response.Switch().
-			//	Case<ResponseSuccess>().
-			//	Case<ResponseOverload>().
-			//	Case<ResponseUnderload>().
-			//	Default(r => { throw new UnexpectedResponseException("Gearbox.Initialize", r); });
-
-			var fullLoad = DataBus.EngineInfo.EngineStationaryFullPower(inAngularVelocity);
-
-			Gear = oldGear;
-			return new ResponseDryRun(this) {
-				Engine = {
-					PowerRequest = response.Engine.PowerRequest,
-					EngineSpeed = response.Engine.EngineSpeed,
-					DynamicFullLoadPower = response.Engine.DynamicFullLoadPower,
-					TorqueOutDemand = response.Engine.TorqueOutDemand,
-					DynamicFullLoadTorque = response.Engine.DynamicFullLoadTorque
-				},
-				Clutch = {
-					PowerRequest = response.Clutch.PowerRequest,
-				},
-				Gearbox = {
-					PowerRequest = outTorque * outAngularVelocity,
-					InputSpeed = inAngularVelocity,
-					InputTorque = inTorque,
-					OutputTorque = outTorque,
-					OutputSpeed = outAngularVelocity,
-				},
-				DeltaFullLoad = response.Engine.PowerRequest - fullLoad
-			};
-		}
 
 		/// <summary>
 		/// Requests the Gearbox to deliver torque and angularVelocity
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
index 167bf5bf84..8a2ec15079 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs
@@ -11,10 +11,12 @@ using TUGraz.VectoCore.Models.Connector.Ports.Impl;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation;
 using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies;
+using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
 using TUGraz.VectoCore.OutputData;
 using TUGraz.VectoCore.Utils;
 
@@ -307,6 +309,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			protected readonly GearList GearList;
 			protected readonly VectoRunData _runData;
 
+			protected TestPowertrain<Gearbox> TestPowertrain;
+
 			public HybridCtlShiftStrategy(HybridController hybridController, IVehicleContainer container) : base(
 				container)
 			{
@@ -334,6 +338,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					MaxStartGear = gear;
 					break;
 				}
+
+				// create testcontainer
+				var testContainer = new SimplePowertrainContainer(_runData);
+				PowertrainBuilder.BuildSimpleHybridPowertrain(_runData, testContainer);
+
+				TestPowertrain = new TestPowertrain<Gearbox>(testContainer, DataBus);
 			}
 
 			public override ShiftPolygon ComputeDeclarationShiftPolygon(GearboxType gearboxType, int i,
@@ -378,10 +388,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				foreach (var entry in GearList.Reverse()) {
 					var gear = entry;
 					//for (var gear = (uint)GearboxModelData.Gears.Count; gear > 1; gear--) {
-					var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+
+					TestPowertrain.UpdateComponents();
+					TestPowertrain.Gearbox.Gear = gear;
+					TestPowertrain.Gearbox._nextGear = gear;
+					if (_controller.CurrentStrategySettings != null) {
+						TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
+					}
+					var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+					response = TestPowertrain.Gearbox.Request(absTime,
+						Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+						true);
 
 					var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
-					var fullLoadPower = response.Engine.PowerRequest - response.DeltaFullLoad;
+					var fullLoadPower = DataBus.EngineInfo.EngineStationaryFullPower(response.Engine.EngineSpeed);
 					var reserve = 1 - response.Engine.PowerRequest / fullLoadPower;
 					var inTorque = response.Clutch.PowerRequest / inAngularSpeed;
 
@@ -426,7 +446,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 						continue;
 					}
 
-					var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+					//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+					TestPowertrain.UpdateComponents();
+					TestPowertrain.Gearbox.Gear = gear;
+					TestPowertrain.Gearbox._nextGear = gear;
+					if (_controller.CurrentStrategySettings != null) {
+						TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
+					}
+
+					var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+					response = TestPowertrain.Gearbox.Request(absTime,
+						Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+						true);
 
 					var fullLoadPower =
 						response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad;
@@ -599,8 +630,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				}
 
 				foreach (var gear in Gears.Reverse()) {
-					var response = _gearbox.Initialize(absTime, gear, torque, outAngularVelocity);
+					//var response = _gearbox.Initialize(absTime, gear, torque, outAngularVelocity);
+					TestPowertrain.UpdateComponents();
+					TestPowertrain.Gearbox.Gear = gear;
+					TestPowertrain.Gearbox._nextGear = gear;
+					if (_controller.CurrentStrategySettings != null) {
+						TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
+					}
 
+					var response = TestPowertrain.Gearbox.Initialize(torque, outAngularVelocity);
+					response = TestPowertrain.Gearbox.Request(absTime,
+						Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, torque, outAngularVelocity,
+						true);
 					if (response.Engine.EngineSpeed > DataBus.EngineInfo.EngineRatedSpeed || response.Engine.EngineSpeed < DataBus.EngineInfo.EngineIdleSpeed) {
 						continue;
 					}
@@ -633,7 +674,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 						continue;
 					}
 
-					var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+					//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+					TestPowertrain.UpdateComponents();
+					TestPowertrain.Gearbox.Gear = gear;
+					TestPowertrain.Gearbox._nextGear = gear;
+					if (_controller.CurrentStrategySettings != null) {
+						TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
+					}
+
+					var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+					response = TestPowertrain.Gearbox.Request(absTime,
+						Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+						true);
 
 					var fullLoadPower =
 						response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVGearbox.cs
index 772ce783ee..cc2209f43f 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVGearbox.cs
@@ -11,41 +11,5 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 	{
 		public PEVGearbox(IVehicleContainer container, IShiftStrategy strategy) : base(container, strategy) { }
 
-		protected internal override ResponseDryRun Initialize(Second absTime, GearshiftPosition gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
-		{
-			var oldGear = Gear;
-			Gear = gear;
-			var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear.Gear].Ratio;
-			var torqueLossResult = ModelData.Gears[gear.Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
-			CurrentState.TorqueLossResult = torqueLossResult;
-			var inTorque = outTorque / ModelData.Gears[gear.Gear].Ratio + torqueLossResult.Value;
-
-			if (!inAngularVelocity.IsEqual(0)) {
-				var alpha = ModelData.Inertia.IsEqual(0)
-					? 0.SI<PerSquareSecond>()
-					: outTorque / ModelData.Inertia;
-
-				var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia,
-					Constants.SimulationSettings.TargetTimeInterval);
-				inTorque += inertiaPowerLoss / inAngularVelocity;
-			}
-
-			var response =
-				NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval, inTorque,
-					inAngularVelocity, true); //NextComponent.Initialize(inTorque, inAngularVelocity);
-
-			var fullLoad = -DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricE2).MaxPowerDrive(DataBus.BatteryInfo.InternalVoltage, inAngularVelocity, Gear);
-
-			Gear = oldGear;
-			return new ResponseDryRun(this, response) {
-				ElectricMotor = {
-					PowerRequest = response.ElectricMotor.PowerRequest
-				},
-				Gearbox = {
-					PowerRequest = outTorque * outAngularVelocity,
-				},
-				DeltaFullLoad = response.ElectricMotor.PowerRequest - fullLoad
-			};
-		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/AMTShiftStrategy.cs
index d20f4a2f9f..4471dd5e06 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/AMTShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/AMTShiftStrategy.cs
@@ -40,10 +40,12 @@ using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.DataBus;
+using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies;
+using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 {
@@ -68,6 +70,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private GearshiftPosition DesiredGearRoadsweeping;
 		private readonly IShiftPolygonCalculator _shiftPolygonCalculator;
 
+		protected TestPowertrain<Gearbox> TestPowertrain;
+
 		public AMTShiftStrategy(IVehicleContainer dataBus) : base(dataBus)
 		{
 			var runData = dataBus.RunData;
@@ -95,6 +99,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					break;
 				}
 			}
+
+			// create testcontainer
+			var testContainer = new SimplePowertrainContainer(runData);
+			PowertrainBuilder.BuildSimplePowertrain(runData, testContainer);
+
+			TestPowertrain = new TestPowertrain<Gearbox>(testContainer, DataBus);
 		}
 
 		private bool SpeedTooLowForEngine(GearshiftPosition gear, PerSecond outAngularSpeed)
@@ -143,10 +153,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			foreach (var gear in Gears.Reverse()) {
 				var selected = gear;
-				var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+				//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+
+				TestPowertrain.UpdateComponents();
+				TestPowertrain.Gearbox.Gear = gear;
+				TestPowertrain.Gearbox._nextGear = gear;
+				
+				var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+				response = TestPowertrain.Gearbox.Request(absTime,
+					Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+					true);
 
 				var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
-				var fullLoadPower = response.Engine.PowerRequest - response.DeltaFullLoad;
+				var fullLoadPower = DataBus.EngineInfo.EngineStationaryFullPower(response.Engine.EngineSpeed);
 				var reserve = 1 - response.Engine.PowerRequest / fullLoadPower;
 				var inTorque = response.Clutch.PowerRequest / inAngularSpeed;
 
@@ -184,7 +203,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 					continue;
 				}
 
-				var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+				//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+				TestPowertrain.UpdateComponents();
+				TestPowertrain.Gearbox.Gear = gear;
+				TestPowertrain.Gearbox._nextGear = gear;
+
+				var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+				response = TestPowertrain.Gearbox.Request(absTime,
+					Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+					true);
 
 				var fullLoadPower = response.Engine.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad;
 				var reserve = 1 - response.Engine.PowerRequest / fullLoadPower;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/PEVAMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/PEVAMTShiftStrategy.cs
index af4eb30b3a..a95252c997 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/PEVAMTShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/PEVAMTShiftStrategy.cs
@@ -5,6 +5,7 @@ using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
 using TUGraz.VectoCore.Models.Connector.Ports.Impl;
 using TUGraz.VectoCore.Models.Declaration;
@@ -16,6 +17,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
 using TUGraz.VectoCore.OutputData;
 using TUGraz.VectoCore.Utils;
 
@@ -89,14 +91,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
 
 		protected bool DriveOffStandstill { get; set; }
 
+		protected TestPowertrain<Gearbox> TestPowertrain;
+
 		public PEVAMTShiftStrategy(IVehicleContainer dataBus) : this(dataBus, false)
 		{
 			if (dataBus.RunData.VehicleData == null) {
 				return;
 			}
 
-			
-
 			EMPos = dataBus.RunData.ElectricMachinesData.FirstOrDefault(x =>
 				x.Item1 == PowertrainPosition.BatteryElectricE2 || x.Item1 == PowertrainPosition.IEPC)?.Item1 ?? PowertrainPosition.HybridPositionNotSet;
 			SetupVelocityDropPreprocessor(dataBus);
@@ -136,6 +138,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
 			DeRatedShiftpolygons = CalculateDeratedShiftLines(em,
 				runData.GearboxData.InputData.Gears, runData.VehicleData.DynamicTyreRadius,
 				runData.AxleGearData?.AxleGear.Ratio ?? 1.0, runData.GearboxData.Type);
+
+			// create testcontainer
+			var testContainer = new SimplePowertrainContainer(runData);
+			PowertrainBuilder.BuildSimplePowertrainElectric(runData, testContainer);
+
+			TestPowertrain = new TestPowertrain<Gearbox>(testContainer, DataBus);
 		}
 
 		protected void SetupVelocityDropPreprocessor(IVehicleContainer dataBus)
@@ -669,10 +677,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
 			var emCtl = emE2.Control;
 			emE2.Control = new PEVInitControl(DataBus as IVehicleContainer);
 			foreach (var gear in GearList.Reverse()) {
-				//for (var gear = (uint)GearboxModelData.Gears.Count; gear > 1; gear--) {
-				var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
-
-				var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
+                //for (var gear = (uint)GearboxModelData.Gears.Count; gear > 1; gear--) {
+                //var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+                TestPowertrain.UpdateComponents();
+                TestPowertrain.Gearbox.Gear = gear;
+                TestPowertrain.Gearbox._nextGear = gear;
+
+                var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+                response = TestPowertrain.Gearbox.Request(absTime,
+                    Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+                    true);
+
+                var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
 				var inTorque = response.ElectricMotor.PowerRequest / inAngularSpeed;
 
 				// if in shift curve and torque reserve is provided: return the current gear
@@ -710,9 +726,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
 					continue;
 				}
 
-				var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+                //var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
+                TestPowertrain.UpdateComponents();
+                TestPowertrain.Gearbox.Gear = gear;
+                TestPowertrain.Gearbox._nextGear = gear;
+
+                var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
+                response = TestPowertrain.Gearbox.Request(absTime,
+                    Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
+                    true);
 
-				var fullLoadPower = -(response.ElectricMotor.MaxDriveTorque * response.ElectricMotor.AngularVelocity);
+                var fullLoadPower = -(response.ElectricMotor.MaxDriveTorque * response.ElectricMotor.AngularVelocity);
 				//.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad;
 				var reserve = 1 - (response.ElectricMotor.TorqueRequestEmMap ?? 0.SI<NewtonMeter>()) / response.ElectricMotor.MaxDriveTorqueEM;
 
-- 
GitLab