Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 121e568c authored by Stefanos Doumpoulakis's avatar Stefanos Doumpoulakis
Browse files

refactoring Powertrains - part II

parent 81682745
Branches
Tags
No related merge requests found
...@@ -82,6 +82,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -82,6 +82,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
private static readonly Dictionary<CycleType, Dictionary<VectoSimulationJobType, Func<VectoRunData, IModalDataContainer, WriteSumData, IVehicleContainer>>> _builders; private static readonly Dictionary<CycleType, Dictionary<VectoSimulationJobType, Func<VectoRunData, IModalDataContainer, WriteSumData, IVehicleContainer>>> _builders;
private static readonly Dictionary<PowertrainPosition, Func<VectoRunData, VehicleContainer, ElectricSystem, IPowerTrainComponent, IElectricMotor>> _MeasuredSpeedBEVBuilders; private static readonly Dictionary<PowertrainPosition, Func<VectoRunData, VehicleContainer, ElectricSystem, IPowerTrainComponent, IElectricMotor>> _MeasuredSpeedBEVBuilders;
private static readonly Dictionary<PowertrainPosition, Func<VectoRunData, VehicleContainer, ElectricSystem, PWheelCycle, IElectricMotor>> _PWheelBEVBuilders;
static PowertrainBuilder() static PowertrainBuilder()
{ {
...@@ -124,17 +125,23 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -124,17 +125,23 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
_MeasuredSpeedBEVBuilders.Add(PowertrainPosition.BatteryElectricE2, BuildMeasuredSpeedForBEV2); _MeasuredSpeedBEVBuilders.Add(PowertrainPosition.BatteryElectricE2, BuildMeasuredSpeedForBEV2);
_MeasuredSpeedBEVBuilders.Add(PowertrainPosition.BatteryElectricE3, BuildMeasuredSpeedForBEV3); _MeasuredSpeedBEVBuilders.Add(PowertrainPosition.BatteryElectricE3, BuildMeasuredSpeedForBEV3);
_MeasuredSpeedBEVBuilders.Add(PowertrainPosition.BatteryElectricE4, BuildMeasuredSpeedForBEV4); _MeasuredSpeedBEVBuilders.Add(PowertrainPosition.BatteryElectricE4, BuildMeasuredSpeedForBEV4);
_PWheelBEVBuilders = new Dictionary<PowertrainPosition, Func<VectoRunData, VehicleContainer, ElectricSystem, PWheelCycle, IElectricMotor>>();
_PWheelBEVBuilders.Add(PowertrainPosition.BatteryElectricE2, BuildPWheelForBEV2);
_PWheelBEVBuilders.Add(PowertrainPosition.BatteryElectricE3, BuildPWheelForBEV3);
_PWheelBEVBuilders.Add(PowertrainPosition.BatteryElectricE4, BuildPWheelForBEV4);
} }
public static IVehicleContainer Build(VectoRunData data, IModalDataContainer modData, ISumData sumWriter = null) public static IVehicleContainer Build(VectoRunData data, IModalDataContainer modData, ISumData sumWriter = null)
{ {
var cycleType = data.Cycle.CycleType; var cycleType = data.Cycle.CycleType;
var jobType = data.JobType;
if (!_builders.ContainsKey(cycleType) || !_builders[cycleType].ContainsKey(data.JobType)) { if (!_builders.ContainsKey(cycleType) || !_builders[cycleType].ContainsKey(jobType)) {
throw new ArgumentException($"Powertrain Builder: cannot build {cycleType} powertrain for job type: {data.JobType}"); throw new ArgumentException($"Powertrain Builder: cannot build {cycleType} powertrain for job type: {jobType}");
} }
return _builders[cycleType][data.JobType].Invoke(data, modData, sumWriter); return _builders[cycleType][jobType].Invoke(data, modData, sumWriter);
} }
/// <summary> /// <summary>
...@@ -170,24 +177,6 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -170,24 +177,6 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
return container; return container;
} }
private static IVehicleContainer BuildForCycle(CycleType cycleType, VectoRunData data, IModalDataContainer modData, WriteSumData sumWriter)
{
VerifyCycleType(data, cycleType);
if (!_builders.ContainsKey(cycleType) || !_builders[cycleType].ContainsKey(data.JobType)) {
throw new ArgumentException($"Powertrain Builder: cannot build {cycleType} powertrain for job type: {data.JobType}");
}
return _builders[cycleType][data.JobType].Invoke(data, modData, sumWriter);
}
private static void VerifyCycleType(VectoRunData data, CycleType cycleType)
{
if (data.Cycle.CycleType != cycleType) {
throw new VectoException("CycleType must be {cycleType}.");
}
}
/// <summary> /// <summary>
/// Builds a PWheel powertrain. /// Builds a PWheel powertrain.
/// <code> /// <code>
...@@ -825,93 +814,81 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -825,93 +814,81 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
ValidateBatteryElectric(data); ValidateBatteryElectric(data);
var container = new VehicleContainer(data.ExecutionMode, modData, sumWriter) { RunData = data }; var container = new VehicleContainer(data.ExecutionMode, modData, sumWriter) { RunData = data };
var es = new ElectricSystem(container); var es = new ElectricSystem(container);
if (data.BatteryData != null) AddBatterySystem<Battery, BatterySystem>(data, container, es);
{ AddSuperCapacitor(data, container, es);
var battery = new BatterySystem(container, data.BatteryData); AddElectricAuxiliary(data, container, es);
battery.Initialize(data.BatteryData.InitialSoC);
es.Connect(battery);
}
if (data.SuperCapData != null)
{
var superCap = new SuperCap(container, data.SuperCapData);
superCap.Initialize(data.SuperCapData.InitialSoC);
es.Connect(superCap);
}
var ctl = new PWheelBatteryElectricMotorController(container, es); var powertrain = new PWheelCycle(container, data.Cycle);
var aux = new ElectricAuxiliary(container); var position = data.ElectricMachinesData.First().Item1;
aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>());
es.Connect(aux);
var powertrain = new PWheelCycle(container, data.Cycle); IElectricMotor em = _PWheelBEVBuilders[position].Invoke(data, container, es, powertrain);
IElectricMotor em; AddBEVBusAuxiliaries(data, container, es, em);
var position = data.ElectricMachinesData.First().Item1; return container;
}
switch (position) private static IElectricMotor BuildPWheelForBEV2(VectoRunData data, VehicleContainer container, ElectricSystem es, PWheelCycle powertrain)
{ {
case PowertrainPosition.BatteryElectricE4: var ctl = new PWheelBatteryElectricMotorController(container, es);
em = GetElectricMachine(PowertrainPosition.BatteryElectricE4, data.ElectricMachinesData, container, es, ctl);
powertrain.AddComponent(em); IElectricMotor em = GetElectricMachine(PowertrainPosition.BatteryElectricE2, data.ElectricMachinesData, container, es, ctl);
new DummyGearboxInfo(container);
new DummyAxleGearInfo(container);
new ATClutchInfo(container);
break;
case PowertrainPosition.BatteryElectricE3:
em = GetElectricMachine(PowertrainPosition.BatteryElectricE3, data.ElectricMachinesData, container, es, ctl);
powertrain powertrain
.AddComponent(new AxleGear(container, data.AxleGearData)) .AddComponent(new AxleGear(container, data.AxleGearData))
.AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null)
.AddComponent(GetRetarder(RetarderType.TransmissionOutputRetarder, data.Retarder, container))
.AddComponent(new CycleGearbox(container, data))
.AddComponent(GetRetarder(RetarderType.TransmissionInputRetarder, data.Retarder, container))
.AddComponent(em); .AddComponent(em);
new DummyGearboxInfo(container);
new ATClutchInfo(container); new ATClutchInfo(container);
new DummyEngineInfo(container); new DummyEngineInfo(container);
break;
case PowertrainPosition.BatteryElectricE2:
em = GetElectricMachine(position, data.ElectricMachinesData, container, es, ctl);
new ZeroMileageCounter(container); new ZeroMileageCounter(container);
return em;
}
private static IElectricMotor BuildPWheelForBEV3(VectoRunData data, VehicleContainer container, ElectricSystem es, PWheelCycle powertrain)
{
var ctl = new PWheelBatteryElectricMotorController(container, es);
IElectricMotor em = GetElectricMachine(PowertrainPosition.BatteryElectricE3, data.ElectricMachinesData, container, es, ctl);
powertrain powertrain
.AddComponent(new AxleGear(container, data.AxleGearData)) .AddComponent(new AxleGear(container, data.AxleGearData))
.AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null)
.AddComponent(GetRetarder(RetarderType.TransmissionOutputRetarder, data.Retarder, container))
.AddComponent(new CycleGearbox(container, data))
.AddComponent(GetRetarder(RetarderType.TransmissionInputRetarder, data.Retarder, container))
.AddComponent(em); .AddComponent(em);
new DummyGearboxInfo(container);
new ATClutchInfo(container); new ATClutchInfo(container);
new DummyEngineInfo(container); new DummyEngineInfo(container);
break;
default: throw new ArgumentOutOfRangeException(nameof(position), position, null); return em;
} }
if (data.BusAuxiliaries != null) private static IElectricMotor BuildPWheelForBEV4(VectoRunData data, VehicleContainer container, ElectricSystem es, PWheelCycle powertrain)
{
if (!data.BusAuxiliaries.ElectricalUserInputsConfig.ConnectESToREESS)
{ {
throw new VectoException("BusAux must be supplied from REESS!"); var ctl = new PWheelBatteryElectricMotorController(container, es);
}
var auxCfg = data.BusAuxiliaries;
var busAux = new BusAuxiliariesAdapter(container, auxCfg); IElectricMotor em = GetElectricMachine(PowertrainPosition.BatteryElectricE4, data.ElectricMachinesData, container, es, ctl);
var electricStorage = new NoBattery(container); powertrain.AddComponent(em);
busAux.ElectricStorage = electricStorage; new DummyGearboxInfo(container);
new DummyAxleGearInfo(container);
new ATClutchInfo(container);
var dcdc = new DCDCConverter(container, return em;
data.BusAuxiliaries.ElectricalUserInputsConfig.DCDCEfficiency);
busAux.DCDCConverter = dcdc;
es.Connect(dcdc);
em.BusAux = busAux;
} }
return container; private static void VerifyCycleType(VectoRunData data, CycleType cycleType)
{
if (data.Cycle.CycleType != cycleType) {
throw new VectoException($"CycleType must be {cycleType}.");
}
} }
private static IPowerTrainComponent GetPEVPTO(VehicleContainer container, VectoRunData data) private static IPowerTrainComponent GetPEVPTO(VehicleContainer container, VectoRunData data)
...@@ -1071,28 +1048,23 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -1071,28 +1048,23 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
private static void AddBEVBusAuxiliaries(VectoRunData data, VehicleContainer container, ElectricSystem es, IElectricMotor em) private static void AddBEVBusAuxiliaries(VectoRunData data, VehicleContainer container, ElectricSystem es, IElectricMotor em)
{ {
if (data.BusAuxiliaries != null) if (data.BusAuxiliaries == null) {
{ return;
if (!data.BusAuxiliaries.ElectricalUserInputsConfig.ConnectESToREESS)
{
throw new VectoException("BusAux must be supplied from REESS!");
} }
var auxCfg = data.BusAuxiliaries; if (!data.BusAuxiliaries.ElectricalUserInputsConfig.ConnectESToREESS) {
throw new VectoException("BusAux must be supplied from REESS!");
var busAux = new BusAuxiliariesAdapter(container, auxCfg); }
var electricStorage = new NoBattery(container); var busAux = new BusAuxiliariesAdapter(container, data.BusAuxiliaries);
busAux.ElectricStorage = electricStorage; var dcdc = new DCDCConverter(container, data.BusAuxiliaries.ElectricalUserInputsConfig.DCDCEfficiency);
var dcdc = new DCDCConverter(container,
data.BusAuxiliaries.ElectricalUserInputsConfig.DCDCEfficiency);
busAux.DCDCConverter = dcdc; busAux.DCDCConverter = dcdc;
busAux.ElectricStorage = new NoBattery(container);
es.Connect(dcdc); es.Connect(dcdc);
em.BusAux = busAux; em.BusAux = busAux;
} }
}
private static IVehicleContainer BuildMeasuredSpeedGearBatteryElectric(VectoRunData data, IModalDataContainer modData, WriteSumData sumWriter) private static IVehicleContainer BuildMeasuredSpeedGearBatteryElectric(VectoRunData data, IModalDataContainer modData, WriteSumData sumWriter)
{ {
...@@ -1100,115 +1072,66 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -1100,115 +1072,66 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
ValidateBatteryElectric(data); ValidateBatteryElectric(data);
var container = new VehicleContainer(data.ExecutionMode, modData, sumWriter) { RunData = data }; var container = new VehicleContainer(data.ExecutionMode, modData, sumWriter) { RunData = data };
var es = new ElectricSystem(container); var es = new ElectricSystem(container);
if (data.BatteryData != null) AddBatterySystem<Battery, BatterySystem>(data, container, es);
{ AddSuperCapacitor(data, container, es);
var battery = new BatterySystem(container, data.BatteryData); AddElectricAuxiliary(data, container, es);
battery.Initialize(data.BatteryData.InitialSoC);
es.Connect(battery);
}
if (data.SuperCapData != null) var position = data.ElectricMachinesData.First().Item1;
{
var superCap = new SuperCap(container, data.SuperCapData); if (position != PowertrainPosition.BatteryElectricE2) {
superCap.Initialize(data.SuperCapData.InitialSoC); throw new ArgumentOutOfRangeException(nameof(position), position, null);
es.Connect(superCap);
} }
var ctl = new BatteryElectricMotorController(container, es); var ctl = new BatteryElectricMotorController(container, es);
IElectricMotor em = GetElectricMachine(position, data.ElectricMachinesData, container, es, ctl);
var aux = new ElectricAuxiliary(container);
aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>());
es.Connect(aux);
var timeBasedCycle = new MeasuredSpeedDrivingCycle(container, data.Cycle); var timeBasedCycle = new MeasuredSpeedDrivingCycle(container, data.Cycle);
IPowerTrainComponent powertrain = timeBasedCycle
timeBasedCycle
.AddComponent(new Vehicle(container, data.VehicleData, data.AirdragData)) .AddComponent(new Vehicle(container, data.VehicleData, data.AirdragData))
.AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia))
.AddComponent(new Brakes(container)); .AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, data.AxleGearData))
IElectricMotor em;
var position = data.ElectricMachinesData.First().Item1;
switch (position)
{
case PowertrainPosition.BatteryElectricE4:
em = GetElectricMachine(PowertrainPosition.BatteryElectricE4, data.ElectricMachinesData, container, es, ctl);
powertrain.AddComponent(em);
new DummyGearboxInfo(container);
new DummyAxleGearInfo(container);
new ATClutchInfo(container);
break;
case PowertrainPosition.BatteryElectricE3:
em = GetElectricMachine(PowertrainPosition.BatteryElectricE3, data.ElectricMachinesData, container, es, ctl);
powertrain.AddComponent(new AxleGear(container, data.AxleGearData))
.AddComponent(em);
new DummyGearboxInfo(container);
new ATClutchInfo(container);
new DummyEngineInfo(container);
break;
case PowertrainPosition.BatteryElectricE2 when data.Cycle.CycleType == CycleType.MeasuredSpeedGear:
em = GetElectricMachine(position, data.ElectricMachinesData, container, es, ctl);
powertrain.AddComponent(new AxleGear(container, data.AxleGearData))
.AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null) .AddComponent(data.AngledriveData != null ? new Angledrive(container, data.AngledriveData) : null)
.AddComponent(new CycleGearbox(container, data)) .AddComponent(new CycleGearbox(container, data))
.AddComponent(em); .AddComponent(em);
new ATClutchInfo(container); new ATClutchInfo(container);
new DummyEngineInfo(container); new DummyEngineInfo(container);
break;
default: throw new ArgumentOutOfRangeException(nameof(position), position, null);
}
if (data.BusAuxiliaries != null)
{
if (!data.BusAuxiliaries.ElectricalUserInputsConfig.ConnectESToREESS)
{
throw new VectoException("BusAux must be supplied from REESS!");
}
var auxCfg = data.BusAuxiliaries;
var busAux = new BusAuxiliariesAdapter(container, auxCfg);
var electricStorage = new NoBattery(container);
busAux.ElectricStorage = electricStorage;
var dcdc = new DCDCConverter(container, AddBEVBusAuxiliaries(data, container, es, em);
data.BusAuxiliaries.ElectricalUserInputsConfig.DCDCEfficiency);
busAux.DCDCConverter = dcdc;
es.Connect(dcdc);
em.BusAux = busAux;
}
return container; return container;
} }
private static void ValidateBatteryElectric(VectoRunData data) private static void ValidateBatteryElectric(VectoRunData data)
{ {
if (data.ElectricMachinesData.Count > 1) if (data.ElectricMachinesData.Count > 1) {
{
throw new VectoException("Electric motors on multiple positions not supported"); throw new VectoException("Electric motors on multiple positions not supported");
} }
if (data.BatteryData != null && data.SuperCapData != null) if (data.BatteryData != null && data.SuperCapData != null) {
{
throw new VectoException("Only one REESS is supported."); throw new VectoException("Only one REESS is supported.");
} }
var position = data.ElectricMachinesData.First().Item1; var position = data.ElectricMachinesData.First().Item1;
if (position == PowertrainPosition.HybridPositionNotSet)
if (position == PowertrainPosition.HybridPositionNotSet) {
throw new VectoException("invalid powertrain position"); throw new VectoException("invalid powertrain position");
}
if (position == PowertrainPosition.HybridP0 || if (position == PowertrainPosition.HybridP0 ||
position == PowertrainPosition.HybridP1 || position == PowertrainPosition.HybridP1 ||
position == PowertrainPosition.HybridP2 || position == PowertrainPosition.HybridP2 ||
position == PowertrainPosition.HybridP3 || position == PowertrainPosition.HybridP3 ||
position == PowertrainPosition.HybridP4) position == PowertrainPosition.HybridP4) {
{
throw new VectoException("BatteryElectric Vehicle does not support parallel powertrain configurations"); throw new VectoException("BatteryElectric Vehicle does not support parallel powertrain configurations");
} }
} }
private static Retarder GetRetarder(RetarderType type, RetarderData data, IVehicleContainer container) => private static Retarder GetRetarder(RetarderType type, RetarderData data, IVehicleContainer container) =>
type == data.Type ? new Retarder(container, data.LossMap, data.Ratio) : null; type == data.Type ? new Retarder(container, data.LossMap, data.Ratio) : null;
......
...@@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric ...@@ -141,7 +141,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
AssertHelper.AssertMetrics(factory, metrics); AssertHelper.AssertMetrics(factory, metrics);
//Directory.Delete(Path.GetDirectoryName(outputFile), recursive: true); Directory.Delete(Path.GetDirectoryName(outputFile), recursive: true);
} }
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment