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