From 711ff9e35f8e632c8262c7b2436738fa85d11715 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Wed, 10 May 2017 13:56:21 +0200
Subject: [PATCH] remove 'old' gearbox maxTorque limitation, add gbx. max speed
 limitation

---
 VECTO/GUI/GearboxGearDialog.vb                |  4 +--
 .../DeclarationDataAdapter.cs                 |  2 +-
 .../EngineeringDataAdapter.cs                 |  2 +-
 .../Models/Simulation/Data/VectoRunData.cs    |  4 ---
 .../Models/Simulation/DataBus/IGearboxInfo.cs |  2 --
 .../Simulation/Impl/VehicleContainer.cs       |  5 ----
 .../Data/Gearbox/GearData.cs                  |  2 +-
 .../Impl/AMTShiftStrategy.cs                  |  2 +-
 .../Impl/ATShiftStrategy.cs                   | 13 +++++-----
 .../Impl/AbstractGearbox.cs                   |  5 ----
 .../Impl/CombustionEngine.cs                  | 25 ++++++-------------
 .../SimulationComponent/Impl/Gearbox.cs       |  4 ---
 .../SimulationRuns/FullPowertrain.cs          |  3 +--
 .../Simulation/LossMapRangeValidationTest.cs  | 16 ++++++------
 .../Models/SimulationComponent/GearboxTest.cs |  2 +-
 15 files changed, 29 insertions(+), 62 deletions(-)

diff --git a/VECTO/GUI/GearboxGearDialog.vb b/VECTO/GUI/GearboxGearDialog.vb
index e4b2381f3d..c3f8789340 100644
--- a/VECTO/GUI/GearboxGearDialog.vb
+++ b/VECTO/GUI/GearboxGearDialog.vb
@@ -68,9 +68,7 @@ Public Class GearboxGearDialog
 			Dim gearData As GearData = New GearData() With {
 					.Ratio = TbRatio.Text.ToDouble(0),
 					.LossMap = lossmap,
-					.ShiftPolygon = shiftPolygon,
-					.MaxTorque =
-					If(String.IsNullOrWhiteSpace(TbMaxTorque.Text), Nothing, TbMaxTorque.Text.ToDouble().SI(Of NewtonMeter))
+					.ShiftPolygon = shiftPolygon
 					}
 			Dim results As IList(Of ValidationResult) =
 					gearData.Validate(If(Cfg.DeclMode, ExecutionMode.Declaration, ExecutionMode.Engineering), GearboxType, False)
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 62edaf670a..5ec459f13e 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -220,7 +220,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 					new GearData {
 						LossMap = gearLossMap,
 						ShiftPolygon = shiftPolygon,
-						MaxTorque = gear.MaxTorque,
+						MaxSpeed = gear.MaxInputSpeed,
 						Ratio = gear.Ratio,
 					});
 			}).ToDictionary(kv => kv.Key, kv => kv.Value);
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 149aaf79ed..9f6a5c08f2 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -188,7 +188,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						dynamicTyreRadius);
 				var gearData = new GearData {
 					ShiftPolygon = shiftPolygon,
-					MaxTorque = gear.MaxTorque,
+					MaxSpeed = gear.MaxInputSpeed,
 					Ratio = gear.Ratio,
 					LossMap = lossMap,
 				};
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index 45554f3d5e..b56c36fd50 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -150,10 +150,6 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 						for (var inTorque = engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 3;
 							inTorque < engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity);
 							inTorque += 2.0 / 3.0 * engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 10.0) {
-							if (gear.Value.MaxTorque != null && inTorque > gear.Value.MaxTorque) {
-								continue;
-							}
-
 							NewtonMeter angledriveTorque;
 							try {
 								angledriveTorque = gear.Value.LossMap.GetOutTorque(angularVelocity, inTorque);
diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs
index d50bab2bdd..4781b613aa 100644
--- a/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs
+++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IGearboxInfo.cs
@@ -53,8 +53,6 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus
 
 		MeterPerSquareSecond StartAcceleration { get; }
 
-		NewtonMeter GearMaxTorque { get; }
-
 		Watt GearboxLoss();
 
 		Second LastShift { get; }
diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
index cb1f4ecb75..17a34bbcf6 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs
@@ -116,11 +116,6 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			}
 		}
 
-		public NewtonMeter GearMaxTorque
-		{
-			get { return Gearbox != null ? Gearbox.GearMaxTorque : null; }
-		}
-
 		public Watt GearboxLoss()
 		{
 			return Gearbox.GearboxLoss();
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
index 2f0f733297..2dfc3f7668 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
@@ -70,7 +70,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 
 		public TransmissionLossMap TorqueConverterGearLossMap { get; internal set; }
 
-		public NewtonMeter MaxTorque { get; internal set; }
+		public PerSecond MaxSpeed { get; internal set; }
 
 		public ShiftPolygon TorqueConverterShiftPolygon { get; set; }
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
index 92b0c3d694..55e58e1d61 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs
@@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		private bool SpeedTooHighForEngine(uint gear, PerSecond outAngularSpeed)
 		{
 			return
-				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(DataBus.EngineN95hSpeed);
+				(outAngularSpeed * ModelData.Gears[gear].Ratio).IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineN95hSpeed);
 		}
 
 		public override GearInfo NextGear
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
index db37ce5e6c..3b0feaae82 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
@@ -47,8 +47,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		public override IGearbox Gearbox
 		{
 			get { return _gearbox; }
-			set
-			{
+			set {
 				_gearbox = value as ATGearbox;
 				if (_gearbox == null) {
 					throw new VectoException("AT Shift strategy can only handle AT gearboxes, given: {0}", value.GetType());
@@ -135,7 +134,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			// 3) 1C -> 0: disengange when negative T_out and positive T_in
 			var gear1C = gear == 1 && !_gearbox.TorqueConverterLocked;
-			var disengageTOutNegativeAndTInPositive = DataBus.DriverAcceleration <= 0 && gear1C && outTorque.IsSmaller(0) && inTorque.IsGreater(0);
+			var disengageTOutNegativeAndTInPositive = DataBus.DriverAcceleration <= 0 && gear1C && outTorque.IsSmaller(0) &&
+													inTorque.IsGreater(0);
 
 			var disengageTCEngineSpeedLowerIdle = braking && torqueNegative && gear1C &&
 												inAngularVelocity.IsSmallerOrEqual(DataBus.EngineIdleSpeed);
@@ -154,12 +154,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 				return true;
 			}
 			// Emergency Upshift: if higher than engine rated speed
-			if (inAngularVelocity.IsGreaterOrEqual(DataBus.EngineRatedSpeed)) {
+			if (inAngularVelocity.IsGreaterOrEqual(ModelData.Gears[gear].MaxSpeed ?? DataBus.EngineRatedSpeed)) {
 				// check if upshift is possible
 				if (!ModelData.Gears.ContainsKey(gear + 1)) {
 					return false;
 				}
-				Log.Debug("engine speed would be above rated speed - shift up");
+				Log.Debug("engine speed would be above max speed / rated speed - shift up");
 				Upshift(absTime, gear);
 				return true;
 			}
@@ -184,8 +184,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime)
 		{
 			var shiftTimeReached = (absTime - lastShiftTime).IsGreaterOrEqual(ModelData.ShiftTime);
-			if (!shiftTimeReached)
+			if (!shiftTimeReached) {
 				return false;
+			}
 
 			var currentGear = ModelData.Gears[gear];
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs
index c3c2fb3477..c1194b4181 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs
@@ -95,11 +95,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			get { return ModelData.StartAcceleration; }
 		}
 
-		public NewtonMeter GearMaxTorque
-		{
-			get { return Gear == 0 || !ModelData.Gears.ContainsKey(Gear) ? null : ModelData.Gears[Gear].MaxTorque; }
-		}
-
 		public Watt GearboxLoss()
 		{
 			var ratio = ModelData.Gears[PreviousState.Gear].HasLockedGear
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
index e35060782f..7d58da8dc8 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs
@@ -206,11 +206,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			//ValidatePowerDemand(totalTorqueDemand, dynamicFullLoadTorque, fullDragTorque); 
 
 			// get max. torque as limited by gearbox. gearbox only limits torqueOut!
-			var gearboxFullLoad = DataBus.GearMaxTorque;
 
-			var deltaFull = ComputeDelta(torqueOut, totalTorqueDemand, dynamicFullLoadTorque, gearboxFullLoad, true);
-			var deltaDrag = ComputeDelta(torqueOut, totalTorqueDemand, fullDragTorque,
-				gearboxFullLoad != null ? -gearboxFullLoad : null, false);
+			var deltaFull = totalTorqueDemand - dynamicFullLoadTorque;
+			//ComputeDelta(torqueOut, totalTorqueDemand, dynamicFullLoadTorque, gearboxFullLoad, true);
+			var deltaDrag = totalTorqueDemand - fullDragTorque; //ComputeDelta(torqueOut, totalTorqueDemand, fullDragTorque,
+			//gearboxFullLoad != null ? -gearboxFullLoad : null, false);
 
 			if (dryRun) {
 				return new ResponseDryRun {
@@ -231,8 +231,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			CurrentState.DynamicFullLoadTorque = dynamicFullLoadTorque;
 			CurrentState.InertiaTorqueLoss = inertiaTorqueLoss;
 
-			if (
-				(deltaFull * avgEngineSpeed).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance) &&
+			if ((deltaFull * avgEngineSpeed).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance) &&
 				(deltaDrag * avgEngineSpeed).IsSmaller(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) {
 				//throw new VectoSimulationException(
 				Log.Error(
@@ -242,10 +241,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 			var minTorque = CurrentState.FullDragTorque;
 			var maxTorque = CurrentState.DynamicFullLoadTorque;
-			if (gearboxFullLoad != null) {
-				minTorque = VectoMath.Max(minTorque, -gearboxFullLoad);
-				maxTorque = VectoMath.Min(maxTorque, gearboxFullLoad);
-			}
 
 			CurrentState.EngineTorque = totalTorqueDemand.LimitTo(minTorque, maxTorque);
 			CurrentState.EnginePower = CurrentState.EngineTorque * avgEngineSpeed;
@@ -292,16 +287,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			};
 		}
 
-		private NewtonMeter ComputeDelta(NewtonMeter torqueOut, NewtonMeter totalTorqueDemand, NewtonMeter maxEngineTorque,
-			NewtonMeter maxGbxtorque, bool motoring)
+		private NewtonMeter ComputeDelta(NewtonMeter torqueOut, NewtonMeter totalTorqueDemand, NewtonMeter maxEngineTorque)
 		{
-			var deltaGbx = maxGbxtorque != null ? torqueOut - maxGbxtorque : null;
 			var deltaEngine = totalTorqueDemand - maxEngineTorque;
-
-			if (deltaGbx == null) {
-				return deltaEngine;
-			}
-			return motoring ? VectoMath.Max(deltaGbx, deltaEngine) : VectoMath.Min(deltaGbx, deltaEngine);
+			return deltaEngine;
 		}
 
 		public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
index ca7fb234f0..e93fb37e67 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
@@ -138,10 +138,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			//	Default(r => { throw new UnexpectedResponseException("Gearbox.Initialize", r); });
 
 			var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity);
-			if (ModelData.Gears[gear].MaxTorque != null) {
-				var fullLoadGearbox = ModelData.Gears[gear].MaxTorque * inAngularVelocity;
-				fullLoad = VectoMath.Min(fullLoadGearbox, fullLoad);
-			}
 
 			return new ResponseDryRun {
 				Source = this,
diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
index 2cd72e1fb4..3e8fa4dce3 100644
--- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs
@@ -316,7 +316,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 				Gears = ratios.Select((ratio, i) =>
 					Tuple.Create((uint)i,
 						new GearData {
-							MaxTorque = ratio > 5 ? 2300.SI<NewtonMeter>() : null,
+//							MaxTorque = ratio > 5 ? 2300.SI<NewtonMeter>() : null,
 							LossMap = TransmissionLossMapReader.ReadFromFile(GearboxLossMap, ratio, string.Format("Gear {0}", i)),
 							Ratio = ratio,
 							ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile)
@@ -353,7 +353,6 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
 				Gears = new Dictionary<uint, GearData> {
 					{
 						1, new GearData {
-							MaxTorque = null,
 							LossMap = TransmissionLossMapReader.ReadFromFile(GearboxLossMap, ratio, "Gear 1"),
 							Ratio = ratio,
 							ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile)
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs b/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs
index 7b07eea317..26dc14cd50 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/LossMapRangeValidationTest.cs
@@ -185,14 +185,14 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			var ratios = new[] { 14.93, 11.64, 9.02, 7.04, 5.64, 4.4, 3.39, 2.65, 2.05, 1.6, 1.28, 1.0 };
 			return new GearboxData {
 				Gears = ratios.Select((ratio, i) =>
-						Tuple.Create((uint)i,
-							new GearData {
-								MaxTorque = 2300.SI<NewtonMeter>(),
-								LossMap = TransmissionLossMapReader.ReadFromFile(!ratio.IsEqual(1.0) ? directlossMap : indirectLossMap, ratio,
-									string.Format("Gear {0}", i)),
-								Ratio = ratio,
-								ShiftPolygon = ShiftPolygonReader.ReadFromFile(ShiftPolygonFile)
-							}))
+					Tuple.Create((uint)i,
+						new GearData {
+//								MaxTorque = 2300.SI<NewtonMeter>(),
+							LossMap = TransmissionLossMapReader.ReadFromFile(!ratio.IsEqual(1.0) ? directlossMap : indirectLossMap, ratio,
+								string.Format("Gear {0}", i)),
+							Ratio = ratio,
+							ShiftPolygon = ShiftPolygonReader.ReadFromFile(ShiftPolygonFile)
+						}))
 					.ToDictionary(k => k.Item1 + 1, v => v.Item2)
 			};
 		}
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
index 94482431b6..21edf9ef5d 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs
@@ -87,7 +87,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
 				Gears = ratios.Select((ratio, i) =>
 						Tuple.Create((uint)i,
 							new GearData {
-								MaxTorque = 2300.SI<NewtonMeter>(),
+//								MaxTorque = 2300.SI<NewtonMeter>(),
 								LossMap = TransmissionLossMapReader.ReadFromFile(i != 6 ? IndirectLossMap : DirectLossMap, ratio,
 									string.Format("Gear {0}", i)),
 								Ratio = ratio,
-- 
GitLab