From 54e663ad54cec0b31b674077d23ef0678bf8faa8 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <quaritsch@ivt.tugraz.at>
Date: Wed, 16 Aug 2023 17:45:54 +0200
Subject: [PATCH] bugfix: reading the voltage level at the completed stage
 results in a null-reference error because the voltage level is not defined.
 use same wrapper class to use same voltage level data for two voltage levels

---
 ...ElectricMotorDeclarationInputDataProvider.cs |  1 +
 .../ElectricMachinesDataAdapter.cs              | 12 ++++++------
 .../GenericBusElectricMotorData.cs              | 17 +++++++++++------
 3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMotorDeclarationInputDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMotorDeclarationInputDataProvider.cs
index ab5a24e25b..49749f994f 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMotorDeclarationInputDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricMotorDeclarationInputDataProvider.cs
@@ -510,6 +510,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public IList<IElectricMotorVoltageLevel> VoltageLevels => 
 			_voltageLevels ?? (_voltageLevels = GetVoltageLevels());
+
 		public TableData DragCurve => ReadDragCurve();
 		public TableData Conditioning => ElementExists(XMLNames.Conditioning)
 			? ReadConditioning() : null;
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
index 64a42dba71..68b4bb322b 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs
@@ -265,9 +265,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 				iepc = new StandardValuesInputData.StandardValueIEPCInputData(iepc, 1.SI<Volt>(), 10E9.SI<Volt>());
 			}
 
-
-
-
 			var pos = PowertrainPosition.IEPC;
 			var count = iepc.DesignTypeWheelMotor && iepc.NrOfDesignTypeWheelMotorMeasured == 1 ? 2 : 1;
 
@@ -277,7 +274,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 				.Select(x => new { x.GearNumber, x.Ratio, Diff = Math.Round(Math.Abs(x.Ratio - 1), 6) }).GroupBy(x => x.Diff)
 				.OrderBy(x => x.Key).First().OrderBy(x => x.Ratio).Reverse().First();
 
-
 			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
 
 			foreach (var entry in iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).AsEnumerable()) {
@@ -447,13 +443,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 			if (iepc == null) {
 				return null;
 			}
+			if (iepc.CertificationMethod == CertificationMethod.StandardValues) {
+				//Fake one very low voltage level and one very high for standard values
+				iepc = new StandardValuesInputData.StandardValueIEPCInputData(iepc, 1.SI<Volt>(), 10E9.SI<Volt>());
+			}
 
-			var pos = PowertrainPosition.IEPC;
+            var pos = PowertrainPosition.IEPC;
 			var count = iepc.DesignTypeWheelMotor && iepc.NrOfDesignTypeWheelMotorMeasured == 1 ? 2 : 1;
             var gearRatioUsedForMeasurement = iepc.Gears
 				.Select(x => new { x.GearNumber, x.Ratio, Diff = Math.Round(Math.Abs(x.Ratio - 1), 6) }).GroupBy(x => x.Diff)
 				.OrderBy(x => x.Key).First().OrderBy(x => x.Ratio).Reverse().First();
-			var voltageLevels = new List<ElectricMotorVoltageLevelData>();
+			//var voltageLevels = new List<ElectricMotorVoltageLevelData>();
 			var genericIEPCData = _genericIepcData.CreateIEPCElectricMotorData(iepc);
 			genericIEPCData.OverloadRecoveryFactor = DeclarationData.OverloadRecoveryFactor;
 			genericIEPCData.TransmissionLossMap =
diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs
index 1d0b903e0f..a0cd0268b5 100644
--- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs
+++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Data;
 using System.Linq;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
@@ -29,8 +30,12 @@ namespace TUGraz.VectoCore.Models.GenericModelData
 			ElectricMachineEntry<IElectricMotorDeclarationInputData> electricMachineEntry,
 			IList<Tuple<Volt, TableData>> torqueLimits, Volt averageVoltage)
 		{
-			var electricMachineType = electricMachineEntry.ElectricMachine.ElectricMachineType;
-			var efficiencyData = GetVoltageLevels(electricMachineEntry, electricMachineType, torqueLimits);
+			var motorData = electricMachineEntry.ElectricMachine;
+			if (electricMachineEntry.ElectricMachine.CertificationMethod == CertificationMethod.StandardValues) {
+				motorData = new StandardValuesInputData.StandardValuesEmInputData(motorData, 1.SI<Volt>(), 10e9.SI<Volt>());
+			}
+            var electricMachineType = electricMachineEntry.ElectricMachine.ElectricMachineType;
+			var efficiencyData = GetVoltageLevels(motorData, electricMachineEntry.Count, electricMachineType, torqueLimits);
 			var powertrainPosition = electricMachineEntry.Position;
             //var adcLossMap = electricMachineEntry.MechanicalTransmissionLossMap;
 			var adcRatio = electricMachineEntry.RatioADC;
@@ -41,6 +46,7 @@ namespace TUGraz.VectoCore.Models.GenericModelData
 					? TransmissionLossMapReader.CreateEmADCLossMap(adcLossMap, adcRatio, "EM ADC LossMap")
 					: TransmissionLossMapReader.CreateEmADCLossMap(DeclarationData.ElectricMachineDefaultMechanicalTransmissionEfficiency, adcRatio, "EM ADC LossMap Eff");
 
+			
 
             var electricMotorData = new ElectricMotorData {
 				RatioPerGear = electricMachineEntry.RatioPerGear,
@@ -49,7 +55,7 @@ namespace TUGraz.VectoCore.Models.GenericModelData
 				EfficiencyData = efficiencyData,
 				Inertia = electricMachineEntry.ElectricMachine.Inertia * electricMachineEntry.Count,//??
 				RatioADC = electricMachineEntry.RatioADC,
-				Overload = CalculateOverloadData(electricMachineEntry.ElectricMachine, electricMachineEntry.Count, efficiencyData, averageVoltage ),
+				Overload = CalculateOverloadData(motorData, electricMachineEntry.Count, efficiencyData, averageVoltage ),
 				TransmissionLossMap = lossMap,
 				OverloadRecoveryFactor = DeclarationData.OverloadRecoveryFactor,
 			};
@@ -132,11 +138,10 @@ namespace TUGraz.VectoCore.Models.GenericModelData
         }
 
         private VoltageLevelData GetVoltageLevels(
-			ElectricMachineEntry<IElectricMotorDeclarationInputData> electricMachineEntry,
+			IElectricMotorDeclarationInputData motorData, int count,
 			ElectricMachineType electricMachineType, IList<Tuple<Volt, TableData>> torqueLimits)
 		{
-			var voltageLevels = electricMachineEntry.ElectricMachine.VoltageLevels;
-			var count = electricMachineEntry.Count;
+			var voltageLevels = motorData.VoltageLevels;
 			var normalizedMap = GetNormalizedEfficiencyMap(electricMachineType);
 
 
-- 
GitLab