From 1ae2403a929ed4207cce20178d46527b1448ef17 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 3 Mar 2022 17:21:06 +0100
Subject: [PATCH] fixes APT-N transmission: treat as automatic transmission, do
 not overwrite model data in component

---
 VectoCommon/VectoCommon/Models/GearboxType.cs   |  4 ++--
 .../DataObjectAdapter/EngineeringDataAdapter.cs | 10 ++++++----
 .../SimulationComponent/Impl/APTNGearbox.cs     |  4 +---
 .../Impl/VelocitySpeedGearshiftPreprocessor.cs  |  4 ++++
 .../Strategies/TestPowertrain.cs                |  2 +-
 .../OutputData/SummaryDataContainer.cs          | 17 ++++++++++-------
 6 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/VectoCommon/VectoCommon/Models/GearboxType.cs b/VectoCommon/VectoCommon/Models/GearboxType.cs
index 3e3e0383a4..d5c29e4951 100644
--- a/VectoCommon/VectoCommon/Models/GearboxType.cs
+++ b/VectoCommon/VectoCommon/Models/GearboxType.cs
@@ -66,11 +66,11 @@ namespace TUGraz.VectoCommon.Models
 
 		[DebuggerStepThrough]
 		public static bool AutomaticTransmission(this GearboxType type) =>
-			type == GearboxType.ATPowerSplit || type == GearboxType.ATSerial;
+			type == GearboxType.ATPowerSplit || type == GearboxType.ATSerial || type == GearboxType.APTN;
 
 		[DebuggerStepThrough]
 		public static bool ManualTransmission(this GearboxType type) =>
-			type == GearboxType.MT || type == GearboxType.AMT || type == GearboxType.APTN;
+			type == GearboxType.MT || type == GearboxType.AMT;
 
 		public static Second TractionInterruption(this GearboxType type)
 		{
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index a1252d14af..23cfb10d4b 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -206,7 +206,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			}
 
 			retVal.Inertia = engine.Inertia +
-							(gbx != null && gbx.Type.AutomaticTransmission() ? torqueConverter.Inertia : 0.SI<KilogramSquareMeter>());
+							(gbx != null && gbx.Type.AutomaticTransmission()
+								? (gbx.Type == GearboxType.APTN ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia)
+								: 0.SI<KilogramSquareMeter>());
 			retVal.EngineStartTime = engine.EngineStartTime ?? DeclarationData.Engine.DefaultEngineStartTime;
 			var limits = torqueLimits.ToDictionary(e => e.Gear);
 			var numGears = gbx?.Gears.Count ?? 0;
@@ -321,7 +323,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			var gears = new Dictionary<uint, GearData>();
 			ShiftPolygon tcShiftPolygon = null;
-			if (gearbox.Type.AutomaticTransmission()) {
+			if (gearbox.Type.AutomaticTransmission() && gearbox.Type != GearboxType.APTN) {
 				tcShiftPolygon = torqueConverter.ShiftPolygon != null
 					? ShiftPolygonReader.Create(torqueConverter.ShiftPolygon)
 					: DeclarationData.TorqueConverter.ComputeShiftPolygon(engineData.FullLoadCurves[0]);
@@ -356,7 +358,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 			retVal.Gears = gears;
 
-			if (retVal.Type.AutomaticTransmission()) {
+			if (retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN) {
 				var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio;
 				retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime;
 				retVal.TorqueConverterData = TorqueConverterDataReader.Create(
@@ -398,7 +400,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal)
 		{
 			retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>();
-			retVal.TractionInterruption = gearbox.TractionInterruption;
+			retVal.TractionInterruption = gearbox.Type == GearboxType.APTN ? 0.SI<Second>() : gearbox.TractionInterruption;
 			
 		}
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs
index bcded50386..f0c00dce38 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/APTNGearbox.cs
@@ -13,9 +13,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 	public class APTNGearbox : Gearbox
 	{
 		public APTNGearbox(IVehicleContainer container, IShiftStrategy strategy) : base(container, strategy)
-		{
-			ModelData.TractionInterruption = 0.SI<Second>();
-		}
+		{ }
 
 		public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
 		{
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs
index 8542399f7b..f4262e239e 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VelocitySpeedGearshiftPreprocessor.cs
@@ -152,6 +152,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		{
 			var simulationInterval = TractionInterruption;
 
+			if (simulationInterval.IsEqual(0)) {
+				return vehicle.VehicleSpeed;
+			}
+
 			var acceleration = 0.SI<MeterPerSquareSecond>();
 			var absTime = 0.SI<Second>();
 			var initialResponse = vehicle.Request(absTime, simulationInterval, acceleration, gradient);
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs
index 2184f718a7..46a49f5cac 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs
@@ -80,7 +80,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
 				}
 			}
 			
-			if (Gearbox != null && Gearbox.GearboxType.AutomaticTransmission()) {
+			if (Gearbox != null && Gearbox.GearboxType.AutomaticTransmission() && Gearbox.GearboxType != GearboxType.APTN) {
 				TorqueConverter = Container.TorqueConverterInfo as TorqueConverter;
 				if (TorqueConverter == null) {
 					throw new VectoException("Torque converter missing for automatic transmission: {0}", Container.TorqueConverterInfo?.GetType().FullName);
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 9c53788dc3..f95b8c7378 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -1065,13 +1065,16 @@ namespace TUGraz.VectoCore.OutputData
 				row[Fields.GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0
 					? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>()
 					: (ConvertedSI)0.SI<Scalar>();
-				row[Fields.TORQUECONVERTER_MANUFACTURER] = data.TorqueConverterData.Manufacturer;
-				row[Fields.TORQUECONVERTER_MODEL] = data.TorqueConverterData.ModelName;
-				row[Fields.TORQUE_CONVERTER_CERTIFICATION_NUMBER] =
-					data.TorqueConverterData.CertificationMethod == CertificationMethod.StandardValues
-						? ""
-						: data.TorqueConverterData.CertificationNumber;
-				row[Fields.TORQUE_CONVERTER_CERTIFICATION_METHOD] = data.TorqueConverterData.CertificationMethod.GetName();
+				if (data.Type != GearboxType.APTN) {
+					row[Fields.TORQUECONVERTER_MANUFACTURER] = data.TorqueConverterData.Manufacturer;
+					row[Fields.TORQUECONVERTER_MODEL] = data.TorqueConverterData.ModelName;
+					row[Fields.TORQUE_CONVERTER_CERTIFICATION_NUMBER] =
+						data.TorqueConverterData.CertificationMethod == CertificationMethod.StandardValues
+							? ""
+							: data.TorqueConverterData.CertificationNumber;
+					row[Fields.TORQUE_CONVERTER_CERTIFICATION_METHOD] =
+						data.TorqueConverterData.CertificationMethod.GetName();
+				}
 			} else {
 				row[Fields.GEAR_RATIO_FIRST_GEAR] = data.Gears.Count > 0
 					? (ConvertedSI)data.Gears.First().Value.Ratio.SI<Scalar>()
-- 
GitLab