From a2a10c75492e6ff8e4889819dc444e2a7540c5a6 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 11 Nov 2016 12:58:59 +0100
Subject: [PATCH] change validation of torque converter data: required max
 speed ratio depends on gear ratio

---
 VectoCore/VectoCore/Configuration/Constants.cs     |  3 +++
 .../Data/Gearbox/TorqueConverterData.cs            | 14 +++++++++-----
 .../Models/SimulationComponent/Data/GearboxData.cs |  5 +++++
 3 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs
index c279598d5c..0f98a24421 100644
--- a/VectoCore/VectoCore/Configuration/Constants.cs
+++ b/VectoCore/VectoCore/Configuration/Constants.cs
@@ -167,6 +167,9 @@ namespace TUGraz.VectoCore.Configuration
 			public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>();
 
 			public static Kilogram MaximumGrossVehicleWeight = 40000.SI<Kilogram>();
+
+			// the torque converter characteristics curve has to be defined up to this speed ratio
+			public const double RequiredTorqueConverterSpeedRatio = 2.2;
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs
index 1ff3afffb5..41c075d927 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/TorqueConverterData.cs
@@ -49,6 +49,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 
 		public PerSecond TorqueConverterSpeedLimit { get; protected internal set; }
 
+		// only used for validation!
+		internal double RequiredSpeedRatio { get; set; }
+
 		protected internal TorqueConverterData(List<TorqueConverterEntry> torqueConverterEntries, PerSecond referenceSpeed,
 			PerSecond maxRpm)
 		{
@@ -73,7 +76,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 			var mpNorm = ReferenceSpeed.Value();
 
 			var min = minSpeed == null ? 0 : minSpeed.Value();
-			
+
 			// Find analytic solution for torque converter operating point
 			// mu = f(nu) = f(n_out / n_in) = T_out / T_in
 			// MP1000 = f(nu) = f(n_out / n_in)
@@ -94,7 +97,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 						torqueOut.Value();
 				var sol = VectoMath.QuadraticEquationSolver(a, b, c);
 
-				var selected = sol.Where(x => x > min 
+				var selected = sol.Where(x => x > min
 											&& angularSpeedOut.Value() / x >= muEdge.P1.X && angularSpeedOut.Value() / x < muEdge.P2.X
 											&& angularSpeedOut.Value() / x >= mpEdge.P1.X && angularSpeedOut.Value() / x < mpEdge.P2.X);
 				solutions.AddRange(selected);
@@ -253,14 +256,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox
 			return retVal;
 		}
 
+		// ReSharper disable once UnusedMember.Global -- used by validation
 		public static ValidationResult ValidateData(TorqueConverterData data, ValidationContext validationContext)
 		{
 			var min = data.TorqueConverterEntries.Min(e => e.SpeedRatio);
 			var max = data.TorqueConverterEntries.Max(e => e.SpeedRatio);
-			if (min > 0 || max < 2.2) {
+			if (min > 0 || max < data.RequiredSpeedRatio) {
 				return new ValidationResult(string.Format(
-					"Torque Converter Data invalid - Speedratio has to cover the range from 0.0 to 2.2: given data only goes from {0} to {1}",
-					min, max));
+					"Torque Converter Data invalid - Speedratio has to cover the range from 0.0 to {2}: given data only goes from {0} to {1}",
+					min, max, data.RequiredSpeedRatio));
 			}
 
 			return ValidationResult.Success;
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
index 54445ef137..8b946ad87b 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs
@@ -29,12 +29,14 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Runtime.Serialization;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent.Data
@@ -111,6 +113,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 			var result = new List<ValidationResult>();
 			if (gearboxData.Type.AutomaticTransmission()) {
+				gearboxData.TorqueConverterData.RequiredSpeedRatio =
+					Math.Round(Constants.SimulationSettings.RequiredTorqueConverterSpeedRatio / gearboxData.Gears[1].Ratio *
+								gearboxData.Gears[1].TorqueConverterRatio, 4);
 				result.AddRange(gearboxData.TorqueConverterData.Validate(mode));
 			}
 
-- 
GitLab