From 6e6f970aabb5c3e3afb9609d3a63d9c33bbc9fd4 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Fri, 10 Apr 2020 17:12:48 +0200
Subject: [PATCH] work on single bus mode: use data from completed bus segment
 table, powertrain config from primary vehicle

---
 .../DeclarationDataAdapterSingleBus.cs        | 224 ++----------------
 ...arationModeSingleBusVectoRunDataFactory.cs |  42 +++-
 .../CompletedBusFactorMethodTest.cs           |  12 +-
 .../Buses/FactorMethod/SingleBus_41-32b.vecto |  12 +
 .../Buses/FactorMethod/SingleBus_42-33b.vecto |  12 +
 VectoCore/VectoCoreTest/VectoCoreTest.csproj  |   6 +
 6 files changed, 98 insertions(+), 210 deletions(-)
 create mode 100644 VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b.vecto
 create mode 100644 VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_42-33b.vecto

diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
index 3716679a84..5c4288d039 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs
@@ -7,6 +7,8 @@ using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.InputData.Reader.Impl;
 using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics;
 using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC;
 using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics;
@@ -14,10 +16,11 @@ using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.SimulationComponent;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 
 namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 {
-	public class DeclarationDataAdapterSingleBus : DeclarationDataAdapterCompletedBusGeneric
+	public class DeclarationDataAdapterSingleBus : DeclarationDataAdapterCompletedBusSpecific
 	{
 		#region Implementation of IDeclarationDataAdapter
 
@@ -45,226 +48,41 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			return retVal;
 		}
 
-		public override AirdragData CreateAirdragData(
-			IAirdragDeclarationInputData airdragData, Mission mission, Segment segment)
-		{
-			if (CompletedVehicle.Components.AirdragInputData == null ||
-				CompletedVehicle.Components.AirdragInputData.AirDragArea == null) {
-				return DefaultAirdragData(mission);
-			}
-
-			var aerodynamicDragArea = CompletedVehicle.Components.AirdragInputData.AirDragArea;
-			var retVal = SetCommonAirdragData(CompletedVehicle.Components.AirdragInputData);
-			retVal.CrossWindCorrectionCurve = new CrosswindCorrectionCdxALookup(
-				aerodynamicDragArea,
-				GetDeclarationAirResistanceCurve(mission.CrossWindCorrectionParameters, aerodynamicDragArea, mission.VehicleHeight),
-				CrossWindCorrectionMode.DeclarationModeCorrection);
-
-			return retVal;
-		}
-
 		#endregion
 
 
-		public ISingleBusInputDataProvider SingleBusInputData { get; set; }
-
-		protected IVehicleDeclarationInputData CompletedVehicle
-		{
-			get { return SingleBusInputData?.CompletedVehicle; }
-		}
-
-
-		#region Overrides of DeclarationDataAdapterPrimaryBus
-
-		protected override double CalculateAlternatorEfficiency(IList<IAlternatorDeclarationInputData> alternators)
+		protected override TransmissionLossMap CreateGearLossMap(
+			ITransmissionInputData gear, uint i, bool useEfficiencyFallback, VehicleCategory vehicleCategory)
 		{
-			var sum = 0.0;
-			foreach (var entry in alternators) {
-				sum += DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup(entry.Technology);
-			}
-
-			foreach (var entry in CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators) {
-				sum += DeclarationData.BusAuxiliaries.AlternatorTechnologies.Lookup(entry.Technology);
-			}
-
-			return sum / (alternators.Count + CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators.Count);
+			return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), true);
 		}
 
-		protected override ElectricsUserInputsConfig GetElectricalUserConfig(
-			Mission mission, IVehicleDeclarationInputData vehicleData, IActuations actuations, VehicleClass vehicleClass)
-		{
-			var currentDemand = GetElectricConsumers(mission, vehicleData, actuations);
-			var busAux = vehicleData.Components.BusAuxiliaries;
-
-			return new ElectricsUserInputsConfig() {
-				SmartElectrical = busAux.ElectricSupply.SmartElectrics,
-				ElectricalConsumers = currentDemand,
-				AlternatorMap =
-					new SimpleAlternator(
-						CalculateAlternatorEfficiency(
-							busAux.ElectricSupply.Alternators.Concat(CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators)
-								.ToList())) {
-						Technologies = busAux.ElectricSupply.Alternators
-											.Concat(CompletedVehicle.Components.BusAuxiliaries.ElectricSupply.Alternators).Select(x => x.Technology)
-											.ToList()
-					},
-				PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage,
-				StoredEnergyEfficiency = Constants.BusAuxiliaries.ElectricSystem.StoredEnergyEfficiency,
-				ResultCardIdle = new DummyResultCard(),
-				ResultCardOverrun = new DummyResultCard(),
-				ResultCardTraction = new DummyResultCard(),
-				AlternatorGearEfficiency = Constants.BusAuxiliaries.ElectricSystem.AlternatorGearEfficiency,
-				MaxAlternatorPower = busAux.ElectricSupply.MaxAlternatorPower,
-				ElectricStorageCapacity = busAux.ElectricSupply.ElectricStorageCapacity ?? 0.SI<WattSecond>()
-			};
-		}
 
-		protected override bool VehicleHasElectricalConsumer(string consumerName, IBusAuxiliariesDeclarationData busAux)
+		protected override TorqueConverterData CreateTorqueConverterData(
+			ITorqueConverterDeclarationInputData torqueConverter, double ratio, CombustionEngineData engineData)
 		{
-			var elConsumer = CompletedVehicle.Components.BusAuxiliaries.ElectricConsumers;
-			switch (consumerName) {
-				case "Day running lights LED bonus": return elConsumer.DayrunninglightsLED;
-				case "Position lights LED bonus": return elConsumer.PositionlightsLED;
-				case "Brake lights LED bonus": return elConsumer.BrakelightsLED;
-				case "Interior lights LED bonus": return elConsumer.InteriorLightsLED;
-				case "Headlights LED bonus": return elConsumer.HeadlightsLED;
-				default: return false;
-			}
+			return TorqueConverterDataReader.Create(
+				torqueConverter.TCData,
+				DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed,
+				ExecutionMode.Declaration, ratio,
+				DeclarationData.TorqueConverter.CLUpshiftMinAcceleration,
+				DeclarationData.TorqueConverter.CCUpshiftMinAcceleration);
 		}
 
 
-		protected override double CalculateLengthDependentElectricalConsumers(Mission mission, IVehicleDeclarationInputData vehicleData)
+		public override AxleGearData CreateAxleGearData(IAxleGearInputData data)
 		{
-			return DeclarationData.BusAuxiliaries.CalculateLengthInteriorLights(
-									CompletedVehicle.Length, IsDoubleDecker, CompletedVehicle.FloorType,
-									CompletedVehicle.NumberOfPassengersLowerDeck)
-								.Value();
-		}
-
-		protected override PneumaticUserInputsConfig GetPneumaticUserConfig(
-			IVehicleDeclarationInputData vehicleData, Mission mission)
-		{
-			var retVal = base.GetPneumaticUserConfig(vehicleData, mission);
-			retVal.Doors = CompletedVehicle.DoorDriveTechnology;
-			retVal.KneelingHeight = VectoMath.Max(
-				0.SI<Meter>(), CompletedVehicle.EntranceHeight - Constants.BusParameters.EntranceHeight);
+			var retVal = SetCommonAxleGearData(data);
+			retVal.AxleGear.LossMap = ReadAxleLossMap(data, false);
 			return retVal;
 		}
 
-		public override ISSMInputs CreateSSMModelParameters(
-			IBusAuxiliariesDeclarationData busAuxInputData, Mission mission, IFuelProperties heatingFuel, LoadingType loading)
-		{
-			var retVal = base.CreateSSMModelParameters(busAuxInputData, mission, heatingFuel, loading) as SSMInputs;
-			if (retVal == null) {
-				throw new VectoException("Unknonw SSMInput Instance");
-			}
-
-			var busAux = CompletedVehicle.Components.BusAuxiliaries;
-
-			var hvacBusLength = busAux.HVACAux.SystemConfiguration == BusHVACSystemConfiguration.Configuration2
-				? 2 * Constants.BusParameters.DriverCompartmentLength
-				: CompletedVehicle.Length;
-			var correctedBusWidth = DeclarationData.BusAuxiliaries.CorrectedBusWidth(CompletedVehicle.Width);
-
-			var hvacBusheight = DeclarationData.BusAuxiliaries.CalculateInternalHeight(
-				CompletedVehicle.FloorType,
-				IsDoubleDecker, CompletedVehicle.Height);
-			var coolingPower = CalculateMaxCoolingPower(CompletedVehicle, mission);
-
-			retVal.BusFloorType = CompletedVehicle.FloorType;
-			retVal.Technologies = GetSSMTechnologyBenefits(busAuxInputData, CompletedVehicle.FloorType);
-			retVal.FuelFiredHeaterPower = busAux.HVACAux.AuxHeaterPower;
-
-			retVal.BusWindowSurface = DeclarationData.BusAuxiliaries.WindowHeight(IsDoubleDecker) * hvacBusLength +
-									DeclarationData.BusAuxiliaries.FrontAndRearWindowArea(IsDoubleDecker);
-			retVal.BusSurfaceArea = 2 * (hvacBusLength * correctedBusWidth + hvacBusLength * CompletedVehicle.Height +
-										correctedBusWidth * CompletedVehicle.Height);
-			retVal.BusVolume = hvacBusLength * correctedBusWidth * hvacBusheight;
-			retVal.UValue = DeclarationData.BusAuxiliaries.UValue(CompletedVehicle.FloorType);
-			retVal.NumberOfPassengers =
-				(DeclarationData.BusAuxiliaries.CalculateBusFloorSurfaceArea(hvacBusLength, correctedBusWidth) *
-				mission.BusParameter.PassengerDensity *
-				(loading == LoadingType.LowLoading ? mission.MissionType.GetLowLoadFactorBus() : 1.0)).LimitTo(
-				0, CompletedVehicle.NumberOfPassengersUpperDeck + CompletedVehicle.NumberOfPassengersLowerDeck) + 1; // add driver for 'heat input'
-			retVal.VentilationRate = DeclarationData.BusAuxiliaries.VentilationRate(busAux.HVACAux.SystemConfiguration, false);
-			retVal.VentilationRateHeating =
-				DeclarationData.BusAuxiliaries.VentilationRate(busAux.HVACAux.SystemConfiguration, true);
-
-			retVal.HVACMaxCoolingPower = coolingPower.Item1 + coolingPower.Item2;
-			retVal.HVACCompressorType = busAux.HVACAux.CompressorTypePassenger; // use passenger compartment
-			retVal.HVACTechnology = string.Format(
-				"{0} ({1})", busAux.HVACAux.SystemConfiguration,
-				string.Join(
-					", ", new[] { busAux.HVACAux.CompressorTypePassenger.GetName(), busAux.HVACAux.CompressorTypeDriver.GetName() }));
-			retVal.COP = DeclarationData.BusAuxiliaries.CalculateCOP(
-				coolingPower.Item1, busAux.HVACAux.CompressorTypeDriver, coolingPower.Item2,
-				busAux.HVACAux.CompressorTypePassenger,
-				CompletedVehicle.FloorType);
-
-			return retVal;
-		}
-
-		protected override Tuple<Watt, Watt> CalculateMaxCoolingPower(IVehicleDeclarationInputData vehicle, Mission mission)
-		{
-			var length = DeclarationData.BusAuxiliaries.CalculateInternalLength(
-				vehicle.Length, IsDoubleDecker, vehicle.FloorType,
-				vehicle.NumberOfPassengersLowerDeck);
-			var height = DeclarationData.BusAuxiliaries.CalculateInternalHeight(vehicle.FloorType,
-																				IsDoubleDecker, vehicle.Height);
-			var volume = length * height * DeclarationData.BusAuxiliaries.CorrectedBusWidth(vehicle.Width);
-
-			var hvacConfiguration = vehicle.Components.BusAuxiliaries.HVACAux.SystemConfiguration;
-
-			var driver = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.DriverMaxCoolingPower(
-				hvacConfiguration, mission.MissionType);
-			var passenger = DeclarationData.BusAuxiliaries.HVACMaxCoolingPower.PassengerMaxCoolingPower(
-				hvacConfiguration, mission.MissionType, volume);
-
-			return Tuple.Create(driver, passenger);
-		}
+		public ISingleBusInputDataProvider SingleBusInputData { get; set; }
 
-		protected override TechnologyBenefits GetSSMTechnologyBenefits(
-			IBusAuxiliariesDeclarationData inputData, FloorType floorType)
+		protected IVehicleDeclarationInputData CompletedVehicle
 		{
-			var onVehicle = new List<SSMTechnology>();
-			var hvacTech = CompletedVehicle.Components.BusAuxiliaries.HVACAux;
-			foreach (var item in DeclarationData.BusAuxiliaries.SSMTechnologyList) {
-				if ("Adjustable coolant thermostat".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
-					(inputData?.HVACAux.AdjustableCoolantThermostat ?? false)) {
-					onVehicle.Add(item);
-				}
-
-				if ("Engine waste gas heat exchanger".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
-					(inputData?.HVACAux.EngineWasteGasHeatExchanger ?? false)) {
-					onVehicle.Add(item);
-				}
-
-				if ("Separate air distribution ducts".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
-					hvacTech.SeparateAirDistributionDucts) {
-					onVehicle.Add(item);
-				}
-				if ("Adjustable auxiliary heater".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
-					hvacTech.AdjustableAuxiliaryHeater) {
-					onVehicle.Add(item);
-				}
-				if ("Heat pump systems".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
-					hvacTech.HeatPump) {
-					onVehicle.Add(item);
-				}
-				if ("Double-glazing".Equals(item.BenefitName, StringComparison.InvariantCultureIgnoreCase) &&
-					hvacTech.DoubleGlasing) {
-					onVehicle.Add(item);
-				}
-			}
-
-			return SelectBenefitForFloorType(floorType, onVehicle);
+			get { return SingleBusInputData?.CompletedVehicle; }
 		}
 
-		#endregion
-
-		protected bool IsDoubleDecker
-		{
-			get { return CompletedVehicle.NumberOfPassengersUpperDeck > 0; }
-		}
 	}
 }
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs
index 0615eb0da4..abb40c8b9d 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs
@@ -1,8 +1,11 @@
 using System;
 using System.Collections.Generic;
+using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.InputData;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
@@ -26,6 +29,36 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
 
 		#region Implementation of IVectoRunDataFactory
 
+		#region Overrides of DeclarationModePrimaryBusVectoRunDataFactory
+
+		protected override Segment GetSegment(IVehicleDeclarationInputData vehicle)
+		{
+			//if (vehicle.VehicleCategory != VehicleCategory.HeavyBusCompletedVehicle) {
+			//	throw new VectoException(
+			//		"Invalid vehicle category for bus factory! {0}", vehicle.VehicleCategory.GetCategoryName());
+			//}
+
+			var completedVehicle = _singleBusInputData.CompletedVehicle;
+
+			var segment = DeclarationData.CompletedBusSegments.Lookup(
+				_singleBusInputData.PrimaryVehicle.AxleConfiguration.NumAxles(), completedVehicle.VehicleCode, completedVehicle.RegisteredClass, completedVehicle.NumberOfPassengersLowerDeck,
+				completedVehicle.Height, completedVehicle.FloorType == FloorType.LowFloor);
+			if (!segment.Found) {
+				throw new VectoException(
+					"no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, articulated: {2}, primary",
+					vehicle.VehicleCategory, _singleBusInputData.PrimaryVehicle.AxleConfiguration,
+					vehicle.Articulated);
+			}
+			foreach (var mission in segment.Missions) {
+				mission.VehicleHeight = completedVehicle.Height + mission.BusParameter.DeltaHeight;
+				mission.BusParameter.VehicleLength = completedVehicle.Length;
+			}
+
+			return segment;
+		}
+
+		#endregion
+
 		protected override IDeclarationDataAdapter DataAdapter { get { return _dao; } }
 
 
@@ -51,7 +84,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
 			var simulationRunData = new VectoRunData {
 				Loading = loading.Key,
 				VehicleData = DataAdapter.CreateVehicleData(vehicle, mission, loading),
-				AirdragData = _dao.CreateAirdragData(_singleBusInputData.CompletedVehicle.Components.AirdragInputData, mission, new Segment()),
+				AirdragData = _dao.CreateAirdragData(_singleBusInputData.CompletedVehicle, mission),
 				EngineData = DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, mission),
 				GearboxData = _gearboxData,
 				AxleGearData = _axlegearData,
@@ -63,17 +96,18 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl {
 				DriverData = _driverdata,
 				ExecutionMode = ExecutionMode.Declaration,
 				JobName = InputDataProvider.JobInputData.JobName,
-				ModFileSuffix = (engineModes.Count > 1 ? string.Format("_EngineMode{0}_", modeIdx) : "") + "_" + mission.BusParameter.BusGroup.GetClassNumber() + "_" + loading.Key.ToString(),
+				ModFileSuffix = (engineModes.Count > 1 ? string.Format("_EngineMode{0}_", modeIdx) : "") + "_" + mission.BusParameter.BusGroup.GetClassNumber() + "-Single_" + loading.Key.ToString(),
 				Report = Report,
 				Mission = mission,
 				InputDataHash = InputDataProvider.XMLHash,
 				SimulationType = SimulationType.DistanceCycle,
 				GearshiftParameters = _gearshiftData,
-				ShiftStrategy = InputDataProvider.JobInputData.ShiftStrategy
+				VehicleDesignSpeed = _segment.DesignSpeed,
+				//ShiftStrategy = InputDataProvider.JobInputData.ShiftStrategy
 			};
 			simulationRunData.EngineData.FuelMode = modeIdx;
 			simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
-			simulationRunData.BusAuxiliaries = _dao.CreateBusAuxiliariesData(mission, _singleBusInputData.PrimaryVehicle, simulationRunData);
+			simulationRunData.BusAuxiliaries = _dao.CreateBusAuxiliariesData(mission, _singleBusInputData.PrimaryVehicle, _singleBusInputData.CompletedVehicle, simulationRunData);
 			return simulationRunData;
 		}
 	}
diff --git a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
index bc8e00f0e4..8c864b688e 100644
--- a/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/CompletedBus/CompletedBusFactorMethodTest.cs
@@ -971,8 +971,11 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
 		}
 
 
-		[TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group41_nonSmart.xml", 12, TestName = "PrintVectoRunData PrimaryBus Group41 SD CO LL"),
-		TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group42_SmartPS.xml", 1, TestName = "PrintVectoRunData PrimaryBus Group42 SD HU RL")]
+		[TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group41_nonSmart.xml", 12, TestName = "PrintVectoRunData PrimaryBus Group41 SD CO/LL"),
+		TestCase(@"TestData\Integration\Buses\FactorMethod\primary_heavyBus group42_SmartPS.xml", 1, TestName = "PrintVectoRunData PrimaryBus Group42 SD HU/RL"),
+		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto", 0, TestName = "PrintVectoRunData SingleBus Group 41/32b CO/LL"),
+		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto", 1, TestName = "PrintVectoRunData SingleBus Group 42/33b HU/RL"),
+			]
 		public void PrintModelParametersPrimaryBus(string jobFile, int runIdx)
 		{
 			var runs = GetVectoRunData(jobFile);
@@ -1006,7 +1009,10 @@ namespace TUGraz.VectoCore.Tests.Integration.CompletedBus
 		[TestCase(JobFile_Group41, TestName = "RunCompletedBusSimulation Group41/32b"),
 		TestCase(JobFile_Group42, TestName = "RunCompletedBusSimulation Group42/33b"),
 		TestCase(JobFilePrimary41, TestName = "RunPrimaryBusSimulation Group41"),
-			TestCase(JobFilePrimary42, TestName = "RunPrimaryBusSimulation Group42")]
+		TestCase(JobFilePrimary42, TestName = "RunPrimaryBusSimulation Group42"),
+		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto", TestName = "RunSingleBusSimulation Group 41/32b"),
+		TestCase(@"TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto", TestName = "RunSingleBusSimulation Group 42/33b"),
+		]
 		public void TestRunCompletedBusSimulation(string jobName)
 		{
 			var relativeJobPath = jobName;
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b.vecto b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b.vecto
new file mode 100644
index 0000000000..cde3f3df79
--- /dev/null
+++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_41-32b.vecto
@@ -0,0 +1,12 @@
+{
+  "Header": {
+	"CreatedBy": "Markus Quaritsch, IVT, Graz University of Technology",
+	"Date": "2020-02-07T15:06:30.9725917Z",
+	"AppVersion": "2.2",
+	"FileVersion": 6
+  },
+  "Body": {
+	"PrimaryVehicle":  "primary_heavyBus group41_nonSmart.xml",
+	"CompletedVehicle": "vecto_vehicle-completed_heavyBus_41.xml"
+  }
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_42-33b.vecto b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_42-33b.vecto
new file mode 100644
index 0000000000..09b9b2d92b
--- /dev/null
+++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/SingleBus_42-33b.vecto
@@ -0,0 +1,12 @@
+{
+  "Header": {
+	"CreatedBy": "Markus Quaritsch, IVT, Graz University of Technology",
+	"Date": "2020-02-07T15:06:30.9725917Z",
+	"AppVersion": "2.2",
+	"FileVersion": 6
+  },
+  "Body": {
+	"PrimaryVehicle":  "primary_heavyBus group42_SmartPS.xml",
+	"CompletedVehicle": "vecto_vehicle-completed_heavyBus_42.xml"
+  }
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
index a4318ff5dd..872a7bc717 100644
--- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj
+++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj
@@ -304,6 +304,12 @@
     <None Include="TestData\Integration\Buses\FactorMethod\CompletedBus_42-33b.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
+    <None Include="TestData\Integration\Buses\FactorMethod\SingleBus_42-33b.vecto">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="TestData\Integration\Buses\FactorMethod\SingleBus_41-32b.vecto">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Include="TestData\Integration\Buses\SingleBus.vecto">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
-- 
GitLab