diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 4a7cddb69c5d4704cf7d070d2e969b5beb527393..ed7337b3d1b97de0fb51c8b583ef8e394fdce9bc 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -46,255 +46,255 @@ using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels; namespace TUGraz.VectoCore.Models.Simulation.Impl { - /// <summary> - /// Provides Methods to build a simulator with a powertrain step by step. - /// </summary> - public class PowertrainBuilder - { - private readonly IModalDataContainer _modData; - private readonly WriteSumData _sumWriter; - - public PowertrainBuilder(IModalDataContainer modData, WriteSumData sumWriter = null) - { - if (modData == null) { - throw new VectoException("Modal Data Container can't be null"); - } - _modData = modData; - _sumWriter = sumWriter; - } - - public VehicleContainer Build(VectoRunData data) - { - switch (data.Cycle.CycleType) { - case CycleType.EngineOnly: - return BuildEngineOnly(data); - case CycleType.PWheel: - return BuildPWheel(data); - case CycleType.MeasuredSpeed: - return BuildMeasuredSpeed(data); - case CycleType.MeasuredSpeedGear: - return BuildMeasuredSpeedGear(data); - case CycleType.DistanceBased: - return BuildFullPowertrain(data); - default: - throw new VectoException("Powertrain Builder cannot build Powertrain for CycleType: {0}", data.Cycle.CycleType); - } - } - - private VehicleContainer BuildEngineOnly(VectoRunData data) - { - if (data.Cycle.CycleType != CycleType.EngineOnly) { - throw new VectoException("CycleType must be EngineOnly."); - } - - var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; - var cycle = new PowertrainDrivingCycle(container, data.Cycle); - - var directAux = new EngineAuxiliary(container); - directAux.AddCycle(Constants.Auxiliaries.Cycle); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.Cycle); - var engine = new EngineOnlyCombustionEngine(container, data.EngineData); - engine.Connect(directAux.Port()); - - cycle.InPort().Connect(engine.OutPort()); - return container; - } - - private VehicleContainer BuildPWheel(VectoRunData data) - { - if (data.Cycle.CycleType != CycleType.PWheel) { - throw new VectoException("CycleType must be PWheel."); - } - - var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; - var gearbox = new CycleGearbox(container, data.GearboxData, data.EngineData.Inertia); - - // PWheelCycle --> AxleGear --> CycleClutch --> Engine <-- Aux - var powertrain = new PWheelCycle(container, data.Cycle, data.AxleGearData.AxleGear.Ratio, - gearbox.ModelData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio)) - .AddComponent(new AxleGear(container, data.AxleGearData)) - .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) - .AddComponent(gearbox, data.Retarder, container) - .AddComponent(new Clutch(container, data.EngineData)); - var engine = new CombustionEngine(container, data.EngineData, pt1Disabled: true); - var idleController = GetIdleController(data.PTO, engine); - - powertrain.AddComponent(engine, idleController) - .AddAuxiliaries(container, data); - - return container; - } - - private VehicleContainer BuildMeasuredSpeed(VectoRunData data) - { - if (data.Cycle.CycleType != CycleType.MeasuredSpeed) { - throw new VectoException("CycleType must be MeasuredSpeed."); - } - - var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; - - // MeasuredSpeedDrivingCycle --> vehicle --> wheels --> brakes - // --> axleGear --> (retarder) --> GearBox --> (retarder) --> Clutch --> engine <-- Aux - var cycle = new MeasuredSpeedDrivingCycle(container, data.Cycle); - var powertrain = cycle - .AddComponent(new Vehicle(container, data.VehicleData)) - .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) - .AddComponent(new Brakes(container)) - .AddComponent(new AxleGear(container, data.AxleGearData)) - .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) - .AddComponent(GetGearbox(container, data.GearboxData, data.EngineData.Inertia), data.Retarder, container); - if (data.GearboxData.Type.ManualTransmission()) { - powertrain = powertrain.AddComponent(new Clutch(container, data.EngineData)); - } - - var engine = new CombustionEngine(container, data.EngineData); - var idleController = GetIdleController(data.PTO, engine); - - powertrain.AddComponent(engine, idleController) - .AddAuxiliaries(container, data); - _modData.HasTorqueConverter = data.GearboxData.Type.AutomaticTransmission(); - - return container; - } - - private VehicleContainer BuildMeasuredSpeedGear(VectoRunData data) - { - if (data.Cycle.CycleType != CycleType.MeasuredSpeedGear) { - throw new VectoException("CycleType must be MeasuredSpeed with Gear."); - } - - var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; - - // MeasuredSpeedDrivingCycle --> vehicle --> wheels --> brakes - // --> axleGear --> (retarder) --> CycleGearBox --> (retarder) --> CycleClutch --> engine <-- Aux - var powertrain = new MeasuredSpeedDrivingCycle(container, data.Cycle) - .AddComponent(new Vehicle(container, data.VehicleData)) - .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) - .AddComponent(new Brakes(container)) - .AddComponent(new AxleGear(container, data.AxleGearData)) - .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) - .AddComponent(new CycleGearbox(container, data.GearboxData, data.EngineData.Inertia)); - if (data.GearboxData.Type.ManualTransmission()) { - powertrain = powertrain.AddComponent(new Clutch(container, data.EngineData)); - } - powertrain.AddComponent(new CombustionEngine(container, data.EngineData)) - .AddAuxiliaries(container, data); - - _modData.HasTorqueConverter = data.GearboxData.Type.AutomaticTransmission(); - - return container; - } - - private VehicleContainer BuildFullPowertrain(VectoRunData data) - { - if (data.Cycle.CycleType != CycleType.DistanceBased) { - throw new VectoException("CycleType must be DistanceBased"); - } - - var container = new VehicleContainer(data.ExecutionMode, _modData, _sumWriter) { RunData = data }; - - // DistanceBasedDrivingCycle --> driver --> vehicle --> wheels - // --> axleGear --> (retarder) --> gearBox --> (retarder) --> clutch --> engine <-- Aux - var cycle = new DistanceBasedDrivingCycle(container, data.Cycle); - var powertrain = cycle.AddComponent(new Driver(container, data.DriverData, new DefaultDriverStrategy())) - .AddComponent(new Vehicle(container, data.VehicleData)) - .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) - .AddComponent(new Brakes(container)) - .AddComponent(new AxleGear(container, data.AxleGearData)) - .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) - .AddComponent(GetGearbox(container, data.GearboxData, data.EngineData.Inertia), data.Retarder, container); - if (data.GearboxData.Type.ManualTransmission()) { - powertrain = powertrain.AddComponent(new Clutch(container, data.EngineData)); - } - - var engine = new CombustionEngine(container, data.EngineData); - var idleController = GetIdleController(data.PTO, engine); - cycle.IdleController = idleController as IdleControllerSwitcher; - - powertrain.AddComponent(engine, idleController) - .AddAuxiliaries(container, data); - - _modData.HasTorqueConverter = data.GearboxData.Type.AutomaticTransmission(); - - return container; - } - - private static IIdleController GetIdleController(PTOData pto, ICombustionEngine engine) - { - var controller = engine.IdleController; - - if (pto != null) { - var ptoController = new PTOCycleController(pto.PTOCycle); - controller = new IdleControllerSwitcher(engine.IdleController, ptoController); - } - - return controller; - } - - internal static IAuxInProvider CreateAdvancedAuxiliaries(VectoRunData data, IVehicleContainer container) - { - var conventionalAux = CreateAuxiliaries(data, container); - var busAux = new BusAuxiliariesAdapter(container, data.AdvancedAux.AdvancedAuxiliaryFilePath, data.Cycle.Name, - data.VehicleData.TotalVehicleWeight(), data.EngineData.ConsumptionMap, data.EngineData.IdleSpeed, conventionalAux); - return busAux; - } - - internal static EngineAuxiliary CreateAuxiliaries(VectoRunData data, IVehicleContainer container) - { - var aux = new EngineAuxiliary(container); - foreach (var auxData in data.Aux) { - // id's in upper case - var id = auxData.ID.ToUpper(); - - switch (auxData.DemandType) { - case AuxiliaryDemandType.Constant: - aux.AddConstant(id, auxData.PowerDemand); - break; - case AuxiliaryDemandType.Direct: - aux.AddCycle(id); - break; - case AuxiliaryDemandType.Mapping: - aux.AddMapping(id, auxData.Data); - break; - default: - throw new ArgumentOutOfRangeException(); - } - container.ModalData.AddAuxiliary(id); - } - - if (data.PTO != null) { - aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission, - DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType)); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, - Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); - - aux.Add(Constants.Auxiliaries.IDs.PTOConsumer, - n => container.CycleData.LeftSample.PTOActive ? null : data.PTO.LossMap.GetTorqueLoss(n) * n); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer, - Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); - } - - return aux; - } - - private static IGearbox GetGearbox(IVehicleContainer container, GearboxData data, KilogramSquareMeter engineInertia) - { - IShiftStrategy strategy; - switch (data.Type) { - case GearboxType.AMT: - strategy = new AMTShiftStrategy(data, container); - break; - case GearboxType.MT: - strategy = new MTShiftStrategy(data, container); - break; - case GearboxType.ATPowerSplit: - case GearboxType.ATSerial: - strategy = new ATShiftStrategy(data, container); - return new ATGearbox(container, data, strategy, engineInertia); - default: - throw new VectoSimulationException("Unknown Gearbox Type: {0}", data.Type); - } - return new Gearbox(container, data, strategy, engineInertia); - } - } + /// <summary> + /// Provides Methods to build a simulator with a powertrain step by step. + /// </summary> + public class PowertrainBuilder + { + private readonly IModalDataContainer _modData; + private readonly WriteSumData _sumWriter; + + public PowertrainBuilder(IModalDataContainer modData, WriteSumData sumWriter = null) + { + if (modData == null) { + throw new VectoException("Modal Data Container can't be null"); + } + _modData = modData; + _sumWriter = sumWriter; + } + + public VehicleContainer Build(VectoRunData data) + { + switch (data.Cycle.CycleType) { + case CycleType.EngineOnly: + return BuildEngineOnly(data); + case CycleType.PWheel: + return BuildPWheel(data); + case CycleType.MeasuredSpeed: + return BuildMeasuredSpeed(data); + case CycleType.MeasuredSpeedGear: + return BuildMeasuredSpeedGear(data); + case CycleType.DistanceBased: + return BuildFullPowertrain(data); + default: + throw new VectoException("Powertrain Builder cannot build Powertrain for CycleType: {0}", data.Cycle.CycleType); + } + } + + private VehicleContainer BuildEngineOnly(VectoRunData data) + { + if (data.Cycle.CycleType != CycleType.EngineOnly) { + throw new VectoException("CycleType must be EngineOnly."); + } + + var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; + var cycle = new PowertrainDrivingCycle(container, data.Cycle); + + var directAux = new EngineAuxiliary(container); + directAux.AddCycle(Constants.Auxiliaries.Cycle); + container.ModalData.AddAuxiliary(Constants.Auxiliaries.Cycle); + var engine = new EngineOnlyCombustionEngine(container, data.EngineData); + engine.Connect(directAux.Port()); + + cycle.InPort().Connect(engine.OutPort()); + return container; + } + + private VehicleContainer BuildPWheel(VectoRunData data) + { + if (data.Cycle.CycleType != CycleType.PWheel) { + throw new VectoException("CycleType must be PWheel."); + } + + var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; + var gearbox = new CycleGearbox(container, data.GearboxData, data.EngineData.Inertia); + + // PWheelCycle --> AxleGear --> CycleClutch --> Engine <-- Aux + var powertrain = new PWheelCycle(container, data.Cycle, data.AxleGearData.AxleGear.Ratio, data.VehicleData, + gearbox.ModelData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio)) + .AddComponent(new AxleGear(container, data.AxleGearData)) + .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) + .AddComponent(gearbox, data.Retarder, container) + .AddComponent(new Clutch(container, data.EngineData)); + var engine = new CombustionEngine(container, data.EngineData, pt1Disabled: true); + var idleController = GetIdleController(data.PTO, engine); + + powertrain.AddComponent(engine, idleController) + .AddAuxiliaries(container, data); + + return container; + } + + private VehicleContainer BuildMeasuredSpeed(VectoRunData data) + { + if (data.Cycle.CycleType != CycleType.MeasuredSpeed) { + throw new VectoException("CycleType must be MeasuredSpeed."); + } + + var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; + + // MeasuredSpeedDrivingCycle --> vehicle --> wheels --> brakes + // --> axleGear --> (retarder) --> GearBox --> (retarder) --> Clutch --> engine <-- Aux + var cycle = new MeasuredSpeedDrivingCycle(container, data.Cycle); + var powertrain = cycle + .AddComponent(new Vehicle(container, data.VehicleData)) + .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) + .AddComponent(new Brakes(container)) + .AddComponent(new AxleGear(container, data.AxleGearData)) + .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) + .AddComponent(GetGearbox(container, data.GearboxData, data.EngineData.Inertia), data.Retarder, container); + if (data.GearboxData.Type.ManualTransmission()) { + powertrain = powertrain.AddComponent(new Clutch(container, data.EngineData)); + } + + var engine = new CombustionEngine(container, data.EngineData); + var idleController = GetIdleController(data.PTO, engine); + + powertrain.AddComponent(engine, idleController) + .AddAuxiliaries(container, data); + _modData.HasTorqueConverter = data.GearboxData.Type.AutomaticTransmission(); + + return container; + } + + private VehicleContainer BuildMeasuredSpeedGear(VectoRunData data) + { + if (data.Cycle.CycleType != CycleType.MeasuredSpeedGear) { + throw new VectoException("CycleType must be MeasuredSpeed with Gear."); + } + + var container = new VehicleContainer(ExecutionMode.Engineering, _modData, _sumWriter) { RunData = data }; + + // MeasuredSpeedDrivingCycle --> vehicle --> wheels --> brakes + // --> axleGear --> (retarder) --> CycleGearBox --> (retarder) --> CycleClutch --> engine <-- Aux + var powertrain = new MeasuredSpeedDrivingCycle(container, data.Cycle) + .AddComponent(new Vehicle(container, data.VehicleData)) + .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) + .AddComponent(new Brakes(container)) + .AddComponent(new AxleGear(container, data.AxleGearData)) + .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) + .AddComponent(new CycleGearbox(container, data.GearboxData, data.EngineData.Inertia)); + if (data.GearboxData.Type.ManualTransmission()) { + powertrain = powertrain.AddComponent(new Clutch(container, data.EngineData)); + } + powertrain.AddComponent(new CombustionEngine(container, data.EngineData)) + .AddAuxiliaries(container, data); + + _modData.HasTorqueConverter = data.GearboxData.Type.AutomaticTransmission(); + + return container; + } + + private VehicleContainer BuildFullPowertrain(VectoRunData data) + { + if (data.Cycle.CycleType != CycleType.DistanceBased) { + throw new VectoException("CycleType must be DistanceBased"); + } + + var container = new VehicleContainer(data.ExecutionMode, _modData, _sumWriter) { RunData = data }; + + // DistanceBasedDrivingCycle --> driver --> vehicle --> wheels + // --> axleGear --> (retarder) --> gearBox --> (retarder) --> clutch --> engine <-- Aux + var cycle = new DistanceBasedDrivingCycle(container, data.Cycle); + var powertrain = cycle.AddComponent(new Driver(container, data.DriverData, new DefaultDriverStrategy())) + .AddComponent(new Vehicle(container, data.VehicleData)) + .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) + .AddComponent(new Brakes(container)) + .AddComponent(new AxleGear(container, data.AxleGearData)) + .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) + .AddComponent(GetGearbox(container, data.GearboxData, data.EngineData.Inertia), data.Retarder, container); + if (data.GearboxData.Type.ManualTransmission()) { + powertrain = powertrain.AddComponent(new Clutch(container, data.EngineData)); + } + + var engine = new CombustionEngine(container, data.EngineData); + var idleController = GetIdleController(data.PTO, engine); + cycle.IdleController = idleController as IdleControllerSwitcher; + + powertrain.AddComponent(engine, idleController) + .AddAuxiliaries(container, data); + + _modData.HasTorqueConverter = data.GearboxData.Type.AutomaticTransmission(); + + return container; + } + + private static IIdleController GetIdleController(PTOData pto, ICombustionEngine engine) + { + var controller = engine.IdleController; + + if (pto != null) { + var ptoController = new PTOCycleController(pto.PTOCycle); + controller = new IdleControllerSwitcher(engine.IdleController, ptoController); + } + + return controller; + } + + internal static IAuxInProvider CreateAdvancedAuxiliaries(VectoRunData data, IVehicleContainer container) + { + var conventionalAux = CreateAuxiliaries(data, container); + var busAux = new BusAuxiliariesAdapter(container, data.AdvancedAux.AdvancedAuxiliaryFilePath, data.Cycle.Name, + data.VehicleData.TotalVehicleWeight, data.EngineData.ConsumptionMap, data.EngineData.IdleSpeed, conventionalAux); + return busAux; + } + + internal static EngineAuxiliary CreateAuxiliaries(VectoRunData data, IVehicleContainer container) + { + var aux = new EngineAuxiliary(container); + foreach (var auxData in data.Aux) { + // id's in upper case + var id = auxData.ID.ToUpper(); + + switch (auxData.DemandType) { + case AuxiliaryDemandType.Constant: + aux.AddConstant(id, auxData.PowerDemand); + break; + case AuxiliaryDemandType.Direct: + aux.AddCycle(id); + break; + case AuxiliaryDemandType.Mapping: + aux.AddMapping(id, auxData.Data); + break; + default: + throw new ArgumentOutOfRangeException(); + } + container.ModalData.AddAuxiliary(id); + } + + if (data.PTO != null) { + aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission, + DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType)); + container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, + Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); + + aux.Add(Constants.Auxiliaries.IDs.PTOConsumer, + n => container.CycleData.LeftSample.PTOActive ? null : data.PTO.LossMap.GetTorqueLoss(n) * n); + container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer, + Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); + } + + return aux; + } + + private static IGearbox GetGearbox(IVehicleContainer container, GearboxData data, KilogramSquareMeter engineInertia) + { + IShiftStrategy strategy; + switch (data.Type) { + case GearboxType.AMT: + strategy = new AMTShiftStrategy(data, container); + break; + case GearboxType.MT: + strategy = new MTShiftStrategy(data, container); + break; + case GearboxType.ATPowerSplit: + case GearboxType.ATSerial: + strategy = new ATShiftStrategy(data, container); + return new ATGearbox(container, data, strategy, engineInertia); + default: + throw new VectoSimulationException("Unknown Gearbox Type: {0}", data.Type); + } + return new Gearbox(container, data, strategy, engineInertia); + } + } } \ No newline at end of file