From 4436140340552172f373a0d47091962ffa7d3ced Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Mon, 31 Oct 2016 13:36:47 +0100
Subject: [PATCH] added RangeOrNaN validation attribute for Gear-Ratio.
 Switched to TC-Ratio for NonLockedGears

---
 VectoCommon/VectoCommon/Utils/Validation.cs           | 11 +++++++++++
 .../DataObjectAdapter/EngineeringDataAdapter.cs       |  6 ++----
 .../VectoCore/Models/Simulation/Data/VectoRunData.cs  |  4 +++-
 .../SimulationComponent/Data/Gearbox/GearData.cs      |  2 +-
 .../SimulationComponent/Impl/ATShiftStrategy.cs       |  6 +++---
 .../SimulationComponent/Impl/AbstractGearbox.cs       |  9 ++++-----
 6 files changed, 24 insertions(+), 14 deletions(-)

diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs
index 7a81b6f9b5..e5a3427f2d 100644
--- a/VectoCommon/VectoCommon/Utils/Validation.cs
+++ b/VectoCommon/VectoCommon/Utils/Validation.cs
@@ -213,6 +213,17 @@ namespace TUGraz.VectoCommon.Utils
 		}
 	}
 
+	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
+	public class RangeOrNaN : RangeAttribute
+	{
+		public override bool IsValid(object value)
+		{
+			return double.IsNaN((double)value) || base.IsValid(value);
+		}
+
+		public RangeOrNaN(double minimum, double maximum) : base(minimum, maximum) {}
+	}
+
 	/// <summary>
 	/// Attribute which validates the Min-Max Range of an SI Object.
 	/// </summary>
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 266f4c89d7..1d2484751a 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -195,10 +195,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						gearData.TorqueConverterGearLossMap = gearData.LossMap;
 						gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null ? null : ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon);
 						// NOTE: the lower gear in 'gears' dictionary has index i !!
-
-						// todo mk-2016-10-27: do not set to NaN -- validation fails! but how to remove locked transmission for previous gear?
-						//gears[i].Ratio = double.NaN;
-						//gears[i].LossMap = null;
+						gears[i].Ratio = double.NaN;
+						gears[i].LossMap = null;
 					}
 				}
 				gears.Add(i + 1, gearData);
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index bcfcba8473..be76ceab6b 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -141,13 +141,15 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 					for (var angularVelocity = engineData.IdleSpeed;
 						angularVelocity < engineData.FullLoadCurve.RatedSpeed;
 						angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurve.RatedSpeed - engineData.IdleSpeed) / 10.0) {
+						if (!gear.Value.HasLockedGear)
+							continue;
+
 						var velocity = angularVelocity / gear.Value.Ratio / angledriveRatio / axlegearRatio * dynamicTyreRadius;
 
 						if (velocity > maxSpeed) {
 							continue;
 						}
 
-
 						for (var inTorque = engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 3;
 							inTorque < engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity);
 							inTorque += 2.0 / 3.0 * engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 10.0) {
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
index 2fa8a90ade..06a8d9c68b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs
@@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 		[ValidateObject]
 		public TransmissionLossMap LossMap { get; internal set; }
 
-		[Required, Range(double.Epsilon, 25)]
+		[Required, RangeOrNaN(double.Epsilon, 25)]
 		public double Ratio { get; internal set; }
 	}
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
index ab8282bc00..5773929f18 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs
@@ -186,10 +186,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			}
 			if (!_gearbox.TorqueConverterLocked && Data.Gears.ContainsKey(gear + 1) && Data.Gears[gear + 1].HasTorqueConverter) {
 				// C -> C upshift
-				var gearRatio = Data.Gears[gear + 1].Ratio / Data.Gears[gear].Ratio;
+				var gearRatio = Data.Gears[gear + 1].TorqueConverterRatio / Data.Gears[gear].TorqueConverterRatio;
 				var minEnginseSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineN80hSpeed - 150.RPMtoRad()));
-				var nextGbxInSpeed = outAngularVelocity * Data.Gears[gear + 1].Ratio;
-				var nextGbxInTorque = outTorque / Data.Gears[gear + 1].Ratio;
+				var nextGbxInSpeed = outAngularVelocity * Data.Gears[gear + 1].TorqueConverterRatio;
+				var nextGbxInTorque = outTorque / Data.Gears[gear + 1].TorqueConverterRatio;
 				var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGbxInTorque, nextGbxInSpeed);
 				if (tcOperatingPoint.InAngularVelocity.IsGreater(minEnginseSpeed) &&
 					DataBus.EngineStationaryFullPower(tcOperatingPoint.InAngularVelocity)
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs
index 16cd74b109..ae9372b50f 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs
@@ -96,13 +96,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public Watt GearboxLoss()
 		{
-			//var outTorque = ModelData.Gears[Gear].LossMap.GetOutTorque(inAngularVelocity, inTorque, true);
-			//var torqueLoss = inTorque - outTorque * ModelData.Gears[Gear].Ratio;
-
-			//return torqueLoss * inAngularVelocity;
+			var ratio = ModelData.Gears[PreviousState.Gear].HasLockedGear
+				? ModelData.Gears[PreviousState.Gear].Ratio
+				: ModelData.Gears[PreviousState.Gear].TorqueConverterRatio;
 
 			return (PreviousState.TransmissionTorqueLoss +
-					PreviousState.InertiaTorqueLossOut / ModelData.Gears[PreviousState.Gear].Ratio) * PreviousState.InAngularVelocity;
+					PreviousState.InertiaTorqueLossOut / ratio) * PreviousState.InAngularVelocity;
 		}
 
 		#endregion
-- 
GitLab