Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 1c124b6e authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

add new mod-data postprocessing class for serial hybrid vehicles. pass over...

add new mod-data postprocessing class for serial hybrid vehicles. pass over genet characteristics from powertrain to postprocessing via run-data instance
parent 75c0320e
No related branches found
No related tags found
No related merge requests found
...@@ -480,6 +480,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -480,6 +480,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
{ {
private static ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute> _attributeDictionary = private static ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute> _attributeDictionary =
new ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute>(); new ConcurrentDictionary<ModalResultField, ModalResultFieldAttribute>();
public static string GetName(this ModalResultField field) public static string GetName(this ModalResultField field)
{ {
return GetAttribute(field).Name ?? field.ToString(); return GetAttribute(field).Name ?? field.ToString();
......
...@@ -48,6 +48,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data; ...@@ -48,6 +48,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.OutputData;
using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData; using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
...@@ -157,6 +158,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -157,6 +158,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
[JsonIgnore] [JsonIgnore]
public IMultistageVIFInputData MultistageVIFInputData { get; internal set; } public IMultistageVIFInputData MultistageVIFInputData { get; internal set; }
// container to pass genset data from powertrain to post-processing, not filled by dataadapter/rundatafactory
public GenSetData GenSet { get; set; }
public class AuxData public class AuxData
{ {
// ReSharper disable once InconsistentNaming // ReSharper disable once InconsistentNaming
...@@ -175,6 +179,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -175,6 +179,12 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
public MissionType? MissionType; public MissionType? MissionType;
} }
// container to pass genset data from powertrain to post-processing, not filled by dataadapter/rundatafactory
public class GenSetData
{
public GenSetCharacteristics GenSetCharacteristics { get; set; }
}
public static ValidationResult ValidateRunData(VectoRunData runData, ValidationContext validationContext) public static ValidationResult ValidateRunData(VectoRunData runData, ValidationContext validationContext)
{ {
var gearboxData = runData.GearboxData; var gearboxData = runData.GearboxData;
......
...@@ -349,8 +349,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -349,8 +349,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
_runsRwLock.EnterWriteLock(); _runsRwLock.EnterWriteLock();
//_unfinishedRuns.Remove(runId); //_unfinishedRuns.Remove(runId);
_unfinishedRuns.TryRemove(runId, out var tmpVal); _unfinishedRuns.TryRemove(runId, out var tmpVal);
if (AllCompletedUnsafe()) if (AllCompletedUnsafe()) {
{
_sumWriter.Finish(); _sumWriter.Finish();
} }
} finally { } finally {
......
...@@ -277,7 +277,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -277,7 +277,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
var minGensetPower = emDtData.EfficiencyData.VoltageLevels.First().FullLoadCurve.MaxPower * StrategyParameters.GensetMinOptPowerFactor; var minGensetPower = emDtData.EfficiencyData.VoltageLevels.First().FullLoadCurve.MaxPower * StrategyParameters.GensetMinOptPowerFactor;
GenSetCharacteristics = new GenSetCharacteristics(minGensetPower); GenSetCharacteristics = new GenSetCharacteristics(minGensetPower);
runData.GenSet = new VectoRunData.GenSetData() { GenSetCharacteristics = GenSetCharacteristics };
// create testcontainer // create testcontainer
var modData = new ModalDataContainer(runData, null, null); var modData = new ModalDataContainer(runData, null, null);
......
...@@ -165,7 +165,11 @@ namespace TUGraz.VectoCore.OutputData ...@@ -165,7 +165,11 @@ namespace TUGraz.VectoCore.OutputData
return; return;
} }
PostProcessingCorrection = new ModalDataPostprocessingCorrection(); var isSerialHybrid = runData.JobType == VectoSimulationJobType.IEPC_S ||
runData.JobType == VectoSimulationJobType.SerialHybridVehicle;
PostProcessingCorrection = isSerialHybrid
? new SerialHybridModalDataPostprocessingCorrection()
: new ModalDataPostprocessingCorrection();
var multipleEngineModes = runData.EngineData?.MultipleEngineFuelModes ?? false; var multipleEngineModes = runData.EngineData?.MultipleEngineFuelModes ?? false;
var fuels = runData.EngineData?.Fuels ?? new List<CombustionEngineFuelData>(); var fuels = runData.EngineData?.Fuels ?? new List<CombustionEngineFuelData>();
......
...@@ -3,6 +3,7 @@ using System.Data; ...@@ -3,6 +3,7 @@ using System.Data;
using System.Linq; using System.Linq;
using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.BusAuxiliaries;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Models.BusAuxiliaries; using TUGraz.VectoCore.Models.BusAuxiliaries;
...@@ -13,6 +14,88 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data; ...@@ -13,6 +14,88 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data;
namespace TUGraz.VectoCore.OutputData namespace TUGraz.VectoCore.OutputData
{ {
public class SerialHybridModalDataPostprocessingCorrection : ModalDataPostprocessingCorrection
{
protected override void SetReesCorrectionDemand(IModalDataContainer modData, VectoRunData runData,
CorrectedModalData r)
{
var deltaEReess = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName());
var startSoc = modData.REESSStartSoC();
var endSoc = modData.REESSEndSoC();
var emEff = 0.0;
if (endSoc < startSoc) {
var etaReessChg = modData.WorkREESSChargeInternal().Value() / modData.WorkREESSChargeTerminal().Value();
emEff = 1.0 / (etaReessChg);
}
if (endSoc > startSoc) {
var etaReessDischg = modData.WorkREESSDischargeTerminal().Value() / modData.WorkREESSDischargeInternal().Value();
emEff = etaReessDischg;
}
r.DeltaEReessMech = double.IsNaN(emEff) ? 0.SI<WattSecond>() : -deltaEReess * emEff;
}
protected override FuelConsumptionCorrection SetFuelConsumptionCorrection(IModalDataContainer modData, VectoRunData runData,
CorrectedModalData r, IFuelProperties fuel)
{
var duration = modData.Duration;
var distance = modData.Distance;
var essParams = runData.DriverData.EngineStopStart;
var engFuel = runData.EngineData.Fuels.First(x => x.FuelData.Equals(fuel));
var fcIceIdle = engFuel.ConsumptionMap.GetFuelConsumptionValue(
0.SI<NewtonMeter>(),
runData.EngineData.IdleSpeed) *
engFuel.FuelConsumptionCorrectionFactor;
var elPowerGenerated = modData.TimeIntegral<WattSecond>(string.Format(ModalResultField.P_EM_electricMotor_el_.GetCaption(), PowertrainPosition.GEN));
var fcGenCharging = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel);
var socCorr = elPowerGenerated.IsEqual(0)
? (runData.GenSet.GenSetCharacteristics.OptimalPoint.FuelConsumption /
runData.GenSet.GenSetCharacteristics.OptimalPoint.ElectricPower).Cast<KilogramPerWattSecond>()
: (fcGenCharging / elPowerGenerated).Cast<KilogramPerWattSecond>();
var engLine = modData.EngineLineCorrectionFactor(fuel);
var comp =
runData.BusAuxiliaries?.PneumaticUserInputsConfig.CompressorMap
.Interpolate(runData.EngineData.IdleSpeed);
var f = new FuelConsumptionCorrection {
Fuel = fuel,
Distance = distance != null && distance.IsGreater(0) ? distance : null,
Duration = duration != null && duration.IsGreater(0) ? duration : null,
EngineLineCorrectionFactor = engLine,
VehicleLine = modData.VehicleLineSlope(fuel),
FcModSum = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel),
FcESS_EngineStart = engLine * modData.WorkEngineStart(),
FcESS_AuxStandstill_ICEOff = r.EnergyAuxICEOffStandstill_UF * engLine,
FcESS_AuxStandstill_ICEOn = r.EnergyAuxICEOnStandstill_UF * engLine +
fcIceIdle * r.ICEOffTimeStandstill * (1 - r.UtilityFactorStandstill),
FcESS_AuxDriving_ICEOff = r.EnergyAuxICEOffDriving_UF * engLine,
FcESS_AuxDriving_ICEOn = r.EnergyAuxICEOnDriving_UF * engLine +
fcIceIdle * r.ICEOffTimeDriving * (1 - r.UtilityFactorDriving),
FcESS_DCDCMissing = r.EnergyDCDCMissing * engLine,
FcBusAuxPSAirDemand = engLine * r.WorkBusAuxPSCorr,
FcBusAuxPSDragICEOffStandstill = comp == null
? 0.SI<Kilogram>()
: comp.PowerOff * r.ICEOffTimeStandstill * engLine * (1 - essParams.UtilityFactorStandstill),
FcBusAuxPSDragICEOffDriving = comp == null
? 0.SI<Kilogram>()
: comp.PowerOff * r.ICEOffTimeDriving * engLine * (1 - essParams.UtilityFactorDriving),
FcREESSSoc = r.DeltaEReessMech * socCorr,
FcBusAuxEs = engLine * r.WorkBusAuxESMech,
FcWHR = engLine * r.WorkWHR,
FcAuxHtr = 0.SI<Kilogram>()
};
return f;
}
}
public class ModalDataPostprocessingCorrection : IModalDataPostProcessor public class ModalDataPostprocessingCorrection : IModalDataPostProcessor
{ {
...@@ -80,17 +163,17 @@ namespace TUGraz.VectoCore.OutputData ...@@ -80,17 +163,17 @@ namespace TUGraz.VectoCore.OutputData
return r; return r;
} }
private void SetReesCorrectionDemand(IModalDataContainer modData, VectoRunData runData, protected virtual void SetReesCorrectionDemand(IModalDataContainer modData, VectoRunData runData,
CorrectedModalData r) CorrectedModalData r)
{ {
var em = runData.ElectricMachinesData?.FirstOrDefault(); var em = runData.ElectricMachinesData?.FirstOrDefault(x => x.Item1 != PowertrainPosition.GEN);
if (em != null) { if (em != null) {
var deltaEReess = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName()); var deltaEReess = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName());
var startSoc = modData.REESSStartSoC(); var startSoc = modData.REESSStartSoC();
var endSoc = modData.REESSEndSoC(); var endSoc = modData.REESSEndSoC();
var emEff = 0.0; var emEff = 0.0;
if (endSoc < startSoc) { if (endSoc < startSoc) {
var etaEmChg = modData.ElectricMotorEfficiencyGenerate(em.Item1); var etaEmChg = modData.ElectricMotorEfficiencyGenerate(em.Item1);
var etaReessChg = modData.WorkREESSChargeInternal().Value() / modData.WorkREESSChargeTerminal().Value(); var etaReessChg = modData.WorkREESSChargeInternal().Value() / modData.WorkREESSChargeTerminal().Value();
emEff = 1.0 / (etaEmChg * etaReessChg); emEff = 1.0 / (etaEmChg * etaReessChg);
...@@ -107,7 +190,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -107,7 +190,7 @@ namespace TUGraz.VectoCore.OutputData
} }
} }
private static FuelConsumptionCorrection SetFuelConsumptionCorrection(IModalDataContainer modData, VectoRunData runData, protected virtual FuelConsumptionCorrection SetFuelConsumptionCorrection(IModalDataContainer modData, VectoRunData runData,
CorrectedModalData r, IFuelProperties fuel) CorrectedModalData r, IFuelProperties fuel)
{ {
var duration = modData.Duration; var duration = modData.Duration;
...@@ -163,7 +246,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -163,7 +246,7 @@ namespace TUGraz.VectoCore.OutputData
return f; return f;
} }
private static void SetAuxHeaterDemand(IModalDataContainer modData, CorrectedModalData r, Second duration) protected virtual void SetAuxHeaterDemand(IModalDataContainer modData, CorrectedModalData r, Second duration)
{ {
var engineWasteheatSum = modData.FuelData.Aggregate( var engineWasteheatSum = modData.FuelData.Aggregate(
0.SI<Joule>(), 0.SI<Joule>(),
...@@ -174,7 +257,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -174,7 +257,7 @@ namespace TUGraz.VectoCore.OutputData
: modData.AuxHeaterDemandCalc(duration, engineWasteheatSum); : modData.AuxHeaterDemandCalc(duration, engineWasteheatSum);
} }
private static void SetMissingDCDCEnergy(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r) protected virtual void SetMissingDCDCEnergy(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r)
{ {
// either case C1, C2a, or C3a // either case C1, C2a, or C3a
var missingDCDCEnergy = modData.TimeIntegral<WattSecond>(ModalResultField.P_DCDC_missing); var missingDCDCEnergy = modData.TimeIntegral<WattSecond>(ModalResultField.P_DCDC_missing);
...@@ -203,7 +286,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -203,7 +286,7 @@ namespace TUGraz.VectoCore.OutputData
//} //}
} }
private static void SetBusAuxMissingPSWork(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r) protected virtual void SetBusAuxMissingPSWork(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r)
{ {
var actuations = new Actuations() { var actuations = new Actuations() {
Braking = runData.BusAuxiliaries.Actuations.Braking, Braking = runData.BusAuxiliaries.Actuations.Braking,
...@@ -234,7 +317,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -234,7 +317,7 @@ namespace TUGraz.VectoCore.OutputData
r.WorkBusAuxPSCorr = (r.kAir * r.DeltaAir).Cast<WattSecond>(); r.WorkBusAuxPSCorr = (r.kAir * r.DeltaAir).Cast<WattSecond>();
} }
private static void SetMissingEnergyICEOFf(IModalDataContainer modData, CorrectedModalData r) protected virtual void SetMissingEnergyICEOFf(IModalDataContainer modData, CorrectedModalData r)
{ {
var entriesAuxICEStandstill = modData.GetValues(x => new { var entriesAuxICEStandstill = modData.GetValues(x => new {
dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()), dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()),
...@@ -263,7 +346,7 @@ namespace TUGraz.VectoCore.OutputData ...@@ -263,7 +346,7 @@ namespace TUGraz.VectoCore.OutputData
r.EnergyAuxICEOnDriving = entriesAuxICEDriving.Sum(x => x.P_on * x.dt) ?? 0.SI<WattSecond>(); r.EnergyAuxICEOnDriving = entriesAuxICEDriving.Sum(x => x.P_on * x.dt) ?? 0.SI<WattSecond>();
} }
private static void SetWHRWork(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r) protected virtual void SetWHRWork(IModalDataContainer modData, VectoRunData runData, CorrectedModalData r)
{ {
// no post-processing correction for electric WHR for HEV (WHR is connected to REESS in simulation) // no post-processing correction for electric WHR for HEV (WHR is connected to REESS in simulation)
r.WorkWHREl = (runData.BatteryData != null || runData.SuperCapData != null) && runData.EngineData.WHRType.IsElectrical() r.WorkWHREl = (runData.BatteryData != null || runData.SuperCapData != null) && runData.EngineData.WHRType.IsElectrical()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment