From a947d1bc671410ccb60e235d51345bd6801b792d Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 3 Jul 2017 13:21:00 +0200
Subject: [PATCH] updating repo

---
 .../Simulation/Impl/SimulatorFactory.cs       | 324 +++++++-------
 .../Integration/CoachPowerTrain.cs            | 406 +++++++++---------
 packages/repositories.config                  |   1 +
 3 files changed, 366 insertions(+), 365 deletions(-)

diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
index 8d72fe2608..eb8bf008cc 100644
--- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs
@@ -29,166 +29,166 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-using System.Threading;
-using TUGraz.VectoCommon.Exceptions;
-using TUGraz.VectoCommon.InputData;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.InputData;
-using TUGraz.VectoCore.InputData.Reader.Impl;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.ModFilter;
-using TUGraz.VectoCore.OutputData.XML;
-
-namespace TUGraz.VectoCore.Models.Simulation.Impl
-{
-	public class SimulatorFactory : LoggingObject
-	{
-		private static int _jobNumberCounter;
-
-		private readonly ExecutionMode _mode;
-		private readonly bool _engineOnlyMode;
-
-		public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer,
-			IDeclarationReport declarationReport = null, bool validate = true)
-		{
-			Log.Info("########## VectoCore Version {0} ##########", Assembly.GetExecutingAssembly().GetName().Version);
-			JobNumber = Interlocked.Increment(ref _jobNumberCounter);
-			_mode = mode;
-			ModWriter = writer;
-			Validate = validate;
-
-			int workerThreads;
-			int completionThreads;
-			ThreadPool.GetMinThreads(out workerThreads, out completionThreads);
-			if (workerThreads < 12) {
-				workerThreads = 12;
-			}
-			ThreadPool.SetMinThreads(workerThreads, completionThreads);
-
-			switch (mode) {
-				case ExecutionMode.Declaration:
-					var declDataProvider = dataProvider as IDeclarationInputDataProvider;
-					if (declDataProvider == null) {
-						throw new VectoException("InputDataProvider does not implement DeclarationData interface");
-					}
-					var report = declarationReport ?? new XMLDeclarationReport(writer);
-					DataReader = new DeclarationModeVectoRunDataFactory(declDataProvider, report);
-					break;
-				case ExecutionMode.Engineering:
-					var engDataProvider = dataProvider as IEngineeringInputDataProvider;
-					if (engDataProvider == null) {
-						throw new VectoException("InputDataProvider does not implement Engineering interface");
-					}
-					if (engDataProvider.JobInputData().EngineOnlyMode) {
-						DataReader = new EngineOnlyVectoRunDataFactory(engDataProvider);
-						_engineOnlyMode = true;
-					} else {
-						DataReader = new EngineeringModeVectoRunDataFactory(engDataProvider);
-					}
-					break;
-				default:
-					throw new VectoException("Unkown factory mode in SimulatorFactory: {0}", mode);
-			}
-		}
-
-		public bool Validate { get; set; }
-
-		public IVectoRunDataFactory DataReader { get; private set; }
-
-		public SummaryDataContainer SumData { get; set; }
-
-		public IOutputDataWriter ModWriter { get; private set; }
-
-		public int JobNumber { get; set; }
-
-		public bool WriteModalResults { get; set; }
-		public bool ModalResults1Hz { get; set; }
-		public bool ActualModalData { get; set; }
-
-		/// <summary>
-		/// Creates powertrain and initializes it with the component's data.
-		/// </summary>
-		/// <returns>new VectoRun Instance</returns>
-		public IEnumerable<IVectoRun> SimulationRuns()
-		{
-			var i = 0;
-			var modDataFilter = ModalResults1Hz
-				? new IModalDataFilter[] { new ModalData1HzFilter() }
-				: null;
-
-			if (ActualModalData) {
-				modDataFilter = new IModalDataFilter[] { new ActualModalDataFilter(), };
-			}
-
-
-			var warning1Hz = false;
-
-			foreach (var data in DataReader.NextRun()) {
-				var d = data;
-				if (d.Report != null) {
-					d.Report.PrepareResult(d.Loading, d.Mission, d);
-				}
-				Action<ModalDataContainer> addReportResult = writer => {
-					if (d.Report != null) {
-						d.Report.AddResult(d.Loading, d.Mission, d, writer);
-					}
-				};
-				if (!data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz && !warning1Hz) {
-					Log.Error("Output filter for 1Hz results is only available for distance-based cycles!");
-					warning1Hz = true;
-				}
-				IModalDataContainer modContainer =
-					new ModalDataContainer(data, ModWriter,
-						addReportResult: _mode == ExecutionMode.Declaration ? addReportResult : null,
-						writeEngineOnly: _engineOnlyMode,
-						filter: data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz || ActualModalData ? modDataFilter : null) {
-							WriteAdvancedAux = data.AdvancedAux != null && data.AdvancedAux.AuxiliaryAssembly == AuxiliaryModel.Advanced,
-							WriteModalResults = _mode != ExecutionMode.Declaration || WriteModalResults
-						};
-				var current = i++;
-				var builder = new PowertrainBuilder(modContainer, modData => {
-					if (SumData != null) {
-						SumData.Write(modData, JobNumber, current, d);
-						//SumData.Write(modContainer, d.JobName, string.Format("{0}-{1}", JobNumber, current),
-						//	d.Cycle.Name + Constants.FileExtensions.CycleFile, mass, loading, volume ?? 0.SI<CubicMeter>(), gearCount);
-					}
-				});
-
-				VectoRun run;
-
-				switch (data.Cycle.CycleType) {
-					case CycleType.DistanceBased:
-						run = new DistanceRun(builder.Build(data));
-						break;
-					case CycleType.EngineOnly:
-					case CycleType.PWheel:
-					case CycleType.MeasuredSpeed:
-					case CycleType.MeasuredSpeedGear:
-						run = new TimeRun(builder.Build(data));
-						break;
-					case CycleType.PTO:
-						throw new VectoException("PTO Cycle can not be used as main cycle!");
-					default:
-						throw new ArgumentOutOfRangeException("CycleType unknown:" + data.Cycle.CycleType);
-				}
-
-				if (Validate) {
-					var validationErrors = run.Validate(_mode, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type,
-						data.Mission != null && data.Mission.MissionType.IsEMS());
-					if (validationErrors.Any()) {
-						throw new VectoException("Validation of Run-Data Failed: " +
-												string.Join("\n", validationErrors.Select(r => r.ErrorMessage + string.Join("; ", r.MemberNames))));
-					}
-				}
-				yield return run;
-			}
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData;
+using TUGraz.VectoCore.InputData.Reader.Impl;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.ModFilter;
+using TUGraz.VectoCore.OutputData.XML;
+
+namespace TUGraz.VectoCore.Models.Simulation.Impl
+{
+	public class SimulatorFactory : LoggingObject
+	{
+		private static int _jobNumberCounter;
+
+		private readonly ExecutionMode _mode;
+		private readonly bool _engineOnlyMode;
+
+		public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer,
+			IDeclarationReport declarationReport = null, bool validate = true)
+		{
+			Log.Info("########## VectoCore Version {0} ##########", Assembly.GetExecutingAssembly().GetName().Version);
+			JobNumber = Interlocked.Increment(ref _jobNumberCounter);
+			_mode = mode;
+			ModWriter = writer;
+			Validate = validate;
+
+			int workerThreads;
+			int completionThreads;
+			ThreadPool.GetMinThreads(out workerThreads, out completionThreads);
+			if (workerThreads < 12) {
+				workerThreads = 12;
+			}
+			ThreadPool.SetMinThreads(workerThreads, completionThreads);
+
+			switch (mode) {
+				case ExecutionMode.Declaration:
+					var declDataProvider = dataProvider as IDeclarationInputDataProvider;
+					if (declDataProvider == null) {
+						throw new VectoException("InputDataProvider does not implement DeclarationData interface");
+					}
+					var report = declarationReport ?? new XMLDeclarationReport(writer);
+					DataReader = new DeclarationModeVectoRunDataFactory(declDataProvider, report);
+					break;
+				case ExecutionMode.Engineering:
+					var engDataProvider = dataProvider as IEngineeringInputDataProvider;
+					if (engDataProvider == null) {
+						throw new VectoException("InputDataProvider does not implement Engineering interface");
+					}
+					if (engDataProvider.JobInputData().EngineOnlyMode) {
+						DataReader = new EngineOnlyVectoRunDataFactory(engDataProvider);
+						_engineOnlyMode = true;
+					} else {
+						DataReader = new EngineeringModeVectoRunDataFactory(engDataProvider);
+					}
+					break;
+				default:
+					throw new VectoException("Unkown factory mode in SimulatorFactory: {0}", mode);
+			}
+		}
+
+		public bool Validate { get; set; }
+
+		public IVectoRunDataFactory DataReader { get; private set; }
+
+		public SummaryDataContainer SumData { get; set; }
+
+		public IOutputDataWriter ModWriter { get; private set; }
+
+		public int JobNumber { get; set; }
+
+		public bool WriteModalResults { get; set; }
+		public bool ModalResults1Hz { get; set; }
+		public bool ActualModalData { get; set; }
+
+		/// <summary>
+		/// Creates powertrain and initializes it with the component's data.
+		/// </summary>
+		/// <returns>new VectoRun Instance</returns>
+		public IEnumerable<IVectoRun> SimulationRuns()
+		{
+			var i = 0;
+			var modDataFilter = ModalResults1Hz
+				? new IModalDataFilter[] { new ModalData1HzFilter() }
+				: null;
+
+			if (ActualModalData) {
+				modDataFilter = new IModalDataFilter[] { new ActualModalDataFilter(), };
+			}
+
+
+			var warning1Hz = false;
+
+			foreach (var data in DataReader.NextRun()) {
+				var d = data;
+				if (d.Report != null) {
+					d.Report.PrepareResult(d.Loading, d.Mission, d);
+				}
+				Action<ModalDataContainer> addReportResult = writer => {
+					if (d.Report != null) {
+						d.Report.AddResult(d.Loading, d.Mission, d, writer);
+					}
+				};
+				if (!data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz && !warning1Hz) {
+					Log.Error("Output filter for 1Hz results is only available for distance-based cycles!");
+					warning1Hz = true;
+				}
+				IModalDataContainer modContainer =
+					new ModalDataContainer(data, ModWriter,
+						addReportResult: _mode == ExecutionMode.Declaration ? addReportResult : null,
+						writeEngineOnly: _engineOnlyMode,
+						filter: data.Cycle.CycleType.IsDistanceBased() && ModalResults1Hz || ActualModalData ? modDataFilter : null) {
+							WriteAdvancedAux = data.AdvancedAux != null && data.AdvancedAux.AuxiliaryAssembly == AuxiliaryModel.Advanced,
+							WriteModalResults = _mode != ExecutionMode.Declaration || WriteModalResults
+						};
+				var current = i++;
+				var builder = new PowertrainBuilder(modContainer, modData => {
+					if (SumData != null) {
+						SumData.Write(modData, JobNumber, current, d);
+						//SumData.Write(modContainer, d.JobName, string.Format("{0}-{1}", JobNumber, current),
+						//	d.Cycle.Name + Constants.FileExtensions.CycleFile, mass, loading, volume ?? 0.SI<CubicMeter>(), gearCount);
+					}
+				});
+
+				VectoRun run;
+
+				switch (data.Cycle.CycleType) {
+					case CycleType.DistanceBased:
+						run = new DistanceRun(builder.Build(data));
+						break;
+					case CycleType.EngineOnly:
+					case CycleType.PWheel:
+					case CycleType.MeasuredSpeed:
+					case CycleType.MeasuredSpeedGear:
+						run = new TimeRun(builder.Build(data));
+						break;
+					case CycleType.PTO:
+						throw new VectoException("PTO Cycle can not be used as main cycle!");
+					default:
+						throw new ArgumentOutOfRangeException("CycleType unknown:" + data.Cycle.CycleType);
+				}
+
+				if (Validate) {
+					var validationErrors = run.Validate(_mode, data.GearboxData == null ? (GearboxType?)null : data.GearboxData.Type,
+						data.Mission != null && data.Mission.MissionType.IsEMS());
+					if (validationErrors.Any()) {
+						throw new VectoException("Validation of Run-Data Failed: " +
+												string.Join("\n", validationErrors.Select(r => r.ErrorMessage + string.Join("; ", r.MemberNames))));
+					}
+				}
+				yield return run;
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs b/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs
index 6cd925541c..d1f2dcec0a 100644
--- a/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs
+++ b/VectoCore/VectoCoreTest/Integration/CoachPowerTrain.cs
@@ -29,207 +29,207 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using TUGraz.VectoCommon.Models;
-using TUGraz.VectoCommon.Utils;
-using TUGraz.VectoCore.Configuration;
-using TUGraz.VectoCore.InputData.Reader;
-using TUGraz.VectoCore.InputData.Reader.ComponentData;
-using TUGraz.VectoCore.Models.Declaration;
-using TUGraz.VectoCore.Models.Simulation.Data;
-using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
-using TUGraz.VectoCore.Models.SimulationComponent.Impl;
-using TUGraz.VectoCore.OutputData;
-using TUGraz.VectoCore.OutputData.FileIO;
-using TUGraz.VectoCore.Tests.Utils;
-using TUGraz.VectoCore.Utils;
-using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels;
-
-namespace TUGraz.VectoCore.Tests.Integration
-{
-	public class CoachPowerTrain
-	{
-		public const string AccelerationFile = @"TestData\Components\Truck.vacc";
-		public const string EngineFile = @"TestData\Components\24t Coach.veng";
-		public const string EngineFileHigh = @"TestData\Components\24t Coach_high.veng";
-		public const string AxleGearLossMap = @"TestData\Components\Axle.vtlm";
-		public const string GearboxIndirectLoss = @"TestData\Components\Indirect Gear.vtlm";
-		public const string GearboxDirectLoss = @"TestData\Components\Direct Gear.vtlm";
-		public const string GearboxShiftPolygonFile = @"TestData\Components\ShiftPolygons.vgbs";
-		//public const string GearboxFullLoadCurveFile = @"TestData\Components\Gearbox.vfld";
-
-		public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName,
-			bool overspeed = false, KilogramSquareMeter gearBoxInertia = null, bool highEnginePower = true)
-		{
-			var container = CreatePowerTrain(cycleData, Path.GetFileNameWithoutExtension(modFileName), overspeed, gearBoxInertia,
-				highEnginePower);
-			return new DistanceRun(container);
-		}
-
-		public static VehicleContainer CreatePowerTrain(DrivingCycleData cycleData, string modFileName, bool overspeed = false,
-			KilogramSquareMeter gearBoxInertia = null, bool engineHighPower = true)
-		{
-			var fileWriter = new FileOutputWriter(modFileName);
-			var modData = new ModalDataContainer(modFileName, FuelType.DieselCI, fileWriter) { WriteModalResults = true };
-			var container = new VehicleContainer(ExecutionMode.Engineering, modData) {
-				RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData }
-			};
-
-			var gearboxData = CreateGearboxData();
-			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineHighPower ? EngineFileHigh : EngineFile, gearboxData.Gears.Count);
-			var axleGearData = CreateAxleGearData();
-			if (gearBoxInertia != null) {
-				gearboxData.Inertia = gearBoxInertia;
-			}
-
-			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
-			var driverData = CreateDriverData(AccelerationFile, overspeed);
-
-			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
-			var engine = new CombustionEngine(container, engineData);
-			var clutch = new Clutch(container, engineData);
-			var airDragData = CreateAirdragData();
-
-			var runData = new VectoRunData() {
-				VehicleData = vehicleData,
-				AxleGearData = axleGearData,
-				GearboxData = gearboxData,
-				EngineData = engineData,
-				AirdragData = airDragData
-			};
-
-			var tmp = cycle.AddComponent(new Driver(container, driverData, new DefaultDriverStrategy()))
-				.AddComponent(new Vehicle(container, vehicleData, airDragData))
-				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
-				.AddComponent(new Brakes(container))
-				.AddComponent(new AxleGear(container, axleGearData))
-				.AddComponent(new DummyRetarder(container))
-				.AddComponent(new Gearbox(container, new AMTShiftStrategy(runData, container), runData))
-				.AddComponent(clutch)
-				.AddComponent(engine);
-
-			var aux = new EngineAuxiliary(container);
-			aux.AddConstant("ZERO", 0.SI<Watt>());
-			container.ModalData.AddAuxiliary("ZERO");
-
-			engine.Connect(aux.Port());
-
-			return container;
-		}
-
-		private static GearboxData CreateGearboxData()
-		{
-			var ratios = new[] { 6.38, 4.63, 3.44, 2.59, 1.86, 1.35, 1, 0.76 };
-
-			return new GearboxData {
-				Gears = ratios.Select((ratio, i) =>
-					Tuple.Create((uint)i,
-						new GearData {
-							//MaxTorque = 2300.SI<NewtonMeter>(),
-							LossMap = ratio.IsEqual(1)
-								? TransmissionLossMapReader.ReadFromFile(GearboxIndirectLoss, ratio, string.Format("Gear {0}", i))
-								: TransmissionLossMapReader.ReadFromFile(GearboxDirectLoss, ratio, string.Format("Gear {0}", i)),
-							Ratio = ratio,
-							ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile)
-						}))
-					.ToDictionary(k => k.Item1 + 1, v => v.Item2),
-				ShiftTime = 2.SI<Second>(),
-				Inertia = 0.SI<KilogramSquareMeter>(),
-				TractionInterruption = 1.SI<Second>(),
-				StartSpeed = 2.SI<MeterPerSecond>(),
-				StartAcceleration = 0.6.SI<MeterPerSquareSecond>(),
-				StartTorqueReserve = 0.2,
-				TorqueReserve = 0.2,
-				DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay,
-				UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay,
-				UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration
-			};
-		}
-
-		private static AxleGearData CreateAxleGearData()
-		{
-			const double ratio = 3.240355;
-			return new AxleGearData {
-				AxleGear = new GearData {
-					Ratio = ratio,
-					LossMap = TransmissionLossMapReader.ReadFromFile(AxleGearLossMap, ratio, "AxleGear")
-				}
-			};
-		}
-
-		private static VehicleData CreateVehicleData(Kilogram loading)
-		{
-			var axles = new List<Axle> {
-				new Axle {
-					AxleWeightShare = 0.4375,
-					Inertia = 21.66667.SI<KilogramSquareMeter>(),
-					RollResistanceCoefficient = 0.0055,
-					TwinTyres = false,
-					TyreTestLoad = 62538.75.SI<Newton>()
-				},
-				new Axle {
-					AxleWeightShare = 0.375,
-					Inertia = 10.83333.SI<KilogramSquareMeter>(),
-					RollResistanceCoefficient = 0.0065,
-					TwinTyres = true,
-					TyreTestLoad = 52532.55.SI<Newton>()
-				},
-				new Axle {
-					AxleWeightShare = 0.1875,
-					Inertia = 21.66667.SI<KilogramSquareMeter>(),
-					RollResistanceCoefficient = 0.0055,
-					TwinTyres = false,
-					TyreTestLoad = 62538.75.SI<Newton>()
-				}
-			};
-			return new VehicleData {
-				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
-				//AerodynamicDragAera = 3.2634.SI<SquareMeter>(),
-				//CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
-				
-				CurbWeight = 15700.SI<Kilogram>(),
-				Loading = loading,
-				DynamicTyreRadius = 0.52.SI<Meter>(),
-				AxleData = axles,
-				SavedInDeclarationMode = false
-			};
-		}
-
-		private static AirdragData CreateAirdragData()
-		{
-			return new AirdragData() {
-				CrossWindCorrectionCurve =
-					new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(), CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()),
-						CrossWindCorrectionMode.NoCorrection),
-			};
-		}
-
-		private static DriverData CreateDriverData(string accelerationFile, bool overspeed = false)
-		{
-			return new DriverData {
-				AccelerationCurve = AccelerationCurveReader.ReadFromFile(accelerationFile),
-				LookAheadCoasting = new DriverData.LACData {
-					Enabled = true,
-					MinSpeed = 50.KMPHtoMeterPerSecond(),
-					//Deceleration = -0.5.SI<MeterPerSquareSecond>()
-					LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor,
-					LookAheadDecisionFactor = new LACDecisionFactor()
-				},
-				OverSpeedEcoRoll = overspeed
-					? new DriverData.OverSpeedEcoRollData {
-						Mode = DriverMode.Overspeed,
-						MinSpeed = 50.KMPHtoMeterPerSecond(),
-						OverSpeed = 5.KMPHtoMeterPerSecond()
-					}
-					: new DriverData.OverSpeedEcoRollData {
-						Mode = DriverMode.Off
-					},
-			};
-		}
-	}
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using TUGraz.VectoCommon.Models;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Configuration;
+using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
+using TUGraz.VectoCore.Models.Declaration;
+using TUGraz.VectoCore.Models.Simulation.Data;
+using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
+using TUGraz.VectoCore.Models.SimulationComponent.Impl;
+using TUGraz.VectoCore.OutputData;
+using TUGraz.VectoCore.OutputData.FileIO;
+using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
+using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels;
+
+namespace TUGraz.VectoCore.Tests.Integration
+{
+	public class CoachPowerTrain
+	{
+		public const string AccelerationFile = @"TestData\Components\Truck.vacc";
+		public const string EngineFile = @"TestData\Components\24t Coach.veng";
+		public const string EngineFileHigh = @"TestData\Components\24t Coach_high.veng";
+		public const string AxleGearLossMap = @"TestData\Components\Axle.vtlm";
+		public const string GearboxIndirectLoss = @"TestData\Components\Indirect Gear.vtlm";
+		public const string GearboxDirectLoss = @"TestData\Components\Direct Gear.vtlm";
+		public const string GearboxShiftPolygonFile = @"TestData\Components\ShiftPolygons.vgbs";
+		//public const string GearboxFullLoadCurveFile = @"TestData\Components\Gearbox.vfld";
+
+		public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName,
+			bool overspeed = false, KilogramSquareMeter gearBoxInertia = null, bool highEnginePower = true)
+		{
+			var container = CreatePowerTrain(cycleData, Path.GetFileNameWithoutExtension(modFileName), overspeed, gearBoxInertia,
+				highEnginePower);
+			return new DistanceRun(container);
+		}
+
+		public static VehicleContainer CreatePowerTrain(DrivingCycleData cycleData, string modFileName, bool overspeed = false,
+			KilogramSquareMeter gearBoxInertia = null, bool engineHighPower = true)
+		{
+			var fileWriter = new FileOutputWriter(modFileName);
+			var modData = new ModalDataContainer(modFileName, FuelType.DieselCI, fileWriter) { WriteModalResults = true };
+			var container = new VehicleContainer(ExecutionMode.Engineering, modData) {
+				RunData = new VectoRunData { JobName = modFileName, Cycle = cycleData }
+			};
+
+			var gearboxData = CreateGearboxData();
+			var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(engineHighPower ? EngineFileHigh : EngineFile, gearboxData.Gears.Count);
+			var axleGearData = CreateAxleGearData();
+			if (gearBoxInertia != null) {
+				gearboxData.Inertia = gearBoxInertia;
+			}
+
+			var vehicleData = CreateVehicleData(3300.SI<Kilogram>());
+			var driverData = CreateDriverData(AccelerationFile, overspeed);
+
+			var cycle = new DistanceBasedDrivingCycle(container, cycleData);
+			var engine = new CombustionEngine(container, engineData);
+			var clutch = new Clutch(container, engineData);
+			var airDragData = CreateAirdragData();
+
+			var runData = new VectoRunData() {
+				VehicleData = vehicleData,
+				AxleGearData = axleGearData,
+				GearboxData = gearboxData,
+				EngineData = engineData,
+				AirdragData = airDragData
+			};
+
+			var tmp = cycle.AddComponent(new Driver(container, driverData, new DefaultDriverStrategy()))
+				.AddComponent(new Vehicle(container, vehicleData, airDragData))
+				.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
+				.AddComponent(new Brakes(container))
+				.AddComponent(new AxleGear(container, axleGearData))
+				.AddComponent(new DummyRetarder(container))
+				.AddComponent(new Gearbox(container, new AMTShiftStrategy(runData, container), runData))
+				.AddComponent(clutch)
+				.AddComponent(engine);
+
+			var aux = new EngineAuxiliary(container);
+			aux.AddConstant("ZERO", 0.SI<Watt>());
+			container.ModalData.AddAuxiliary("ZERO");
+
+			engine.Connect(aux.Port());
+
+			return container;
+		}
+
+		private static GearboxData CreateGearboxData()
+		{
+			var ratios = new[] { 6.38, 4.63, 3.44, 2.59, 1.86, 1.35, 1, 0.76 };
+
+			return new GearboxData {
+				Gears = ratios.Select((ratio, i) =>
+					Tuple.Create((uint)i,
+						new GearData {
+							//MaxTorque = 2300.SI<NewtonMeter>(),
+							LossMap = ratio.IsEqual(1)
+								? TransmissionLossMapReader.ReadFromFile(GearboxIndirectLoss, ratio, string.Format("Gear {0}", i))
+								: TransmissionLossMapReader.ReadFromFile(GearboxDirectLoss, ratio, string.Format("Gear {0}", i)),
+							Ratio = ratio,
+							ShiftPolygon = ShiftPolygonReader.ReadFromFile(GearboxShiftPolygonFile)
+						}))
+					.ToDictionary(k => k.Item1 + 1, v => v.Item2),
+				ShiftTime = 2.SI<Second>(),
+				Inertia = 0.SI<KilogramSquareMeter>(),
+				TractionInterruption = 1.SI<Second>(),
+				StartSpeed = 2.SI<MeterPerSecond>(),
+				StartAcceleration = 0.6.SI<MeterPerSquareSecond>(),
+				StartTorqueReserve = 0.2,
+				TorqueReserve = 0.2,
+				DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay,
+				UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay,
+				UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration
+			};
+		}
+
+		private static AxleGearData CreateAxleGearData()
+		{
+			const double ratio = 3.240355;
+			return new AxleGearData {
+				AxleGear = new GearData {
+					Ratio = ratio,
+					LossMap = TransmissionLossMapReader.ReadFromFile(AxleGearLossMap, ratio, "AxleGear")
+				}
+			};
+		}
+
+		private static VehicleData CreateVehicleData(Kilogram loading)
+		{
+			var axles = new List<Axle> {
+				new Axle {
+					AxleWeightShare = 0.4375,
+					Inertia = 21.66667.SI<KilogramSquareMeter>(),
+					RollResistanceCoefficient = 0.0055,
+					TwinTyres = false,
+					TyreTestLoad = 62538.75.SI<Newton>()
+				},
+				new Axle {
+					AxleWeightShare = 0.375,
+					Inertia = 10.83333.SI<KilogramSquareMeter>(),
+					RollResistanceCoefficient = 0.0065,
+					TwinTyres = true,
+					TyreTestLoad = 52532.55.SI<Newton>()
+				},
+				new Axle {
+					AxleWeightShare = 0.1875,
+					Inertia = 21.66667.SI<KilogramSquareMeter>(),
+					RollResistanceCoefficient = 0.0055,
+					TwinTyres = false,
+					TyreTestLoad = 62538.75.SI<Newton>()
+				}
+			};
+			return new VehicleData {
+				AxleConfiguration = AxleConfiguration.AxleConfig_6x2,
+				//AerodynamicDragAera = 3.2634.SI<SquareMeter>(),
+				//CrossWindCorrectionMode = CrossWindCorrectionMode.NoCorrection,
+				
+				CurbWeight = 15700.SI<Kilogram>(),
+				Loading = loading,
+				DynamicTyreRadius = 0.52.SI<Meter>(),
+				AxleData = axles,
+				SavedInDeclarationMode = false
+			};
+		}
+
+		private static AirdragData CreateAirdragData()
+		{
+			return new AirdragData() {
+				CrossWindCorrectionCurve =
+					new CrosswindCorrectionCdxALookup(3.2634.SI<SquareMeter>(), CrossWindCorrectionCurveReader.GetNoCorrectionCurve(3.2634.SI<SquareMeter>()),
+						CrossWindCorrectionMode.NoCorrection),
+			};
+		}
+
+		private static DriverData CreateDriverData(string accelerationFile, bool overspeed = false)
+		{
+			return new DriverData {
+				AccelerationCurve = AccelerationCurveReader.ReadFromFile(accelerationFile),
+				LookAheadCoasting = new DriverData.LACData {
+					Enabled = true,
+					MinSpeed = 50.KMPHtoMeterPerSecond(),
+					//Deceleration = -0.5.SI<MeterPerSquareSecond>()
+					LookAheadDistanceFactor = DeclarationData.Driver.LookAhead.LookAheadDistanceFactor,
+					LookAheadDecisionFactor = new LACDecisionFactor()
+				},
+				OverSpeedEcoRoll = overspeed
+					? new DriverData.OverSpeedEcoRollData {
+						Mode = DriverMode.Overspeed,
+						MinSpeed = 50.KMPHtoMeterPerSecond(),
+						OverSpeed = 5.KMPHtoMeterPerSecond()
+					}
+					: new DriverData.OverSpeedEcoRollData {
+						Mode = DriverMode.Off
+					},
+			};
+		}
+	}
 }
\ No newline at end of file
diff --git a/packages/repositories.config b/packages/repositories.config
index 4602b99be1..4120f2246c 100644
--- a/packages/repositories.config
+++ b/packages/repositories.config
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <repositories>
+  <repository path="..\..\VECTO-Bugreports\BugReportTests\packages.config" />
   <repository path="..\VECTO\packages.config" />
   <repository path="..\VECTOAux\VectoAuxiliaries\packages.config" />
   <repository path="..\VECTOAux\VectoAuxiliariesTests\packages.config" />
-- 
GitLab