diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index b8ce281cab63bd3b2eeb2a661e888550431e299c..c6ed4b3ab15b92f901d05fe15c2a0f3a37d6f32c 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -35,6 +35,7 @@ using System.Data; using System.Linq; using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; @@ -141,6 +142,58 @@ namespace TUGraz.VectoCore.OutputData double BatteryStartSoC(); double REESSEndSoC(); WattSecond REESSLoss(); + + ICorrectedModalData CorrectedModalData { get; } + } + + public interface IModalDataPostProcessor + { + ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData); + } + + public interface ICorrectedModalData + { + WattSecond WorkESS { get; } + WattSecond WorkWHREl { get; } + WattSecond WorkWHRElMech { get; } + WattSecond WorkWHRMech { get; } + WattSecond WorkWHR { get; } + WattSecond WorkBusAuxPSCorr { get; } + WattSecond WorkBusAuxESMech { get; } + WattSecond WorkBusAuxCorr { get; } + Joule AuxHeaterDemand { get; } + + IFuelConsumptionCorrection FuelConsumptionCorrection(IFuelProperties fuel); + + KilogramPerMeter KilogramCO2PerMeter { get; } + Dictionary<FuelType, IFuelConsumptionCorrection> FuelCorrection { get; } + Kilogram CO2Total { get; } + Joule EnergyConsumptionTotal { get; } + } + + public interface IFuelConsumptionCorrection + { + IFuelProperties Fuel { get; } + KilogramPerWattSecond EngineLineCorrectionFactor { get; } + KilogramPerWattSecond VehicleLine { get; } + KilogramPerSecond FC_ESS_CORR_H { get; } + KilogramPerSecond FC_BusAux_PS_CORR_H { get; } + KilogramPerSecond FC_BusAux_ES_CORR_H { get; } + KilogramPerSecond FC_WHR_CORR_H { get; } + KilogramPerSecond FC_AUXHTR_H { get; } + KilogramPerSecond FC_AUXHTR_H_CORR { get; } + KilogramPerSecond FC_FINAL_H { get; } + KilogramPerMeter FC_WHR_CORR_KM { get; } + KilogramPerMeter FC_BusAux_PS_CORR_KM { get; } + KilogramPerMeter FC_BusAux_ES_CORR_KM { get; } + KilogramPerMeter FC_AUXHTR_KM { get; } + KilogramPerMeter FC_AUXHTR_KM_CORR { get; } + KilogramPerMeter FC_ESS_CORR_KM { get; } + KilogramPerMeter FC_FINAL_KM { get; } + VolumePerMeter FuelVolumePerMeter { get; } + + Kilogram TotalFuelConsumptionCorrected { get; } + Joule EnergyDemand { get; } } public static class ModalDataContainerExtensions diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index 5d5269c774add1c5e080cdc8e8fce3b9e72e966f..a7b1b69a44191e7e3ecf5db37915e3cbaf2199fd 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -108,8 +108,10 @@ namespace TUGraz.VectoCore.OutputData private Dictionary<PowertrainPosition, WattSecond> _eEmRecuperateMot = new Dictionary<PowertrainPosition, WattSecond>(); protected VectoRunData _runData; - - + private ICorrectedModalData _correctedModalData; + public IModalDataPostProcessor PostProcessingCorrection { set; protected get; } + + public ModalDataContainer(VectoRunData runData, IModalDataWriter writer, Action<ModalDataContainer> addReportResult, params IModalDataFilter[] filter) { _runData = runData; @@ -126,6 +128,8 @@ namespace TUGraz.VectoCore.OutputData return; } + PostProcessingCorrection = new ModalDataPostprocessingCorrection(); + var multipleEngineModes = runData.EngineData?.MultipleEngineFuelModes ?? false; var fuels = runData.EngineData?.Fuels ?? new List<CombustionEngineFuelData>(); foreach (var fuel in fuels) { @@ -506,6 +510,12 @@ namespace TUGraz.VectoCore.OutputData return TimeIntegral<WattSecond>(ModalResultField.P_reess_loss); } + public ICorrectedModalData CorrectedModalData + { + get { return _correctedModalData ?? (_correctedModalData = PostProcessingCorrection.ApplyCorrection(this, _runData)); } + } + + public void CalculateAggregateValues() { var duration = Duration; @@ -585,6 +595,7 @@ namespace TUGraz.VectoCore.OutputData _duration = null; _distance = null; _timeIntegrals.Clear(); + _correctedModalData = null; } protected virtual Second CalcDuration() diff --git a/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs new file mode 100644 index 0000000000000000000000000000000000000000..1c88aa1b1870908c752a53fa43d5908caf13962a --- /dev/null +++ b/VectoCore/VectoCore/OutputData/ModalDataPostprocessingCorrection.cs @@ -0,0 +1,215 @@ +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; + +namespace TUGraz.VectoCore.OutputData +{ + public class ModalDataPostprocessingCorrection : IModalDataPostProcessor + { + + #region Implementation of IModalDataPostProcessor + + public ICorrectedModalData ApplyCorrection(IModalDataContainer modData, VectoRunData runData) + { + var r = new CorrectedModalData(); + var duration = modData.Duration; + var distance = modData.Distance; + + r.WorkESS = modData.WorkAuxiliariesDuringEngineStop() + modData.WorkEngineStart(); + + r.WorkWHREl = modData.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr); + r.WorkWHRElMech = -r.WorkWHREl / DeclarationData.AlternaterEfficiency; + r.WorkWHRMech = -modData.TimeIntegral<WattSecond>(ModalResultField.P_WHR_mech_corr); + //r.WorkWHR = r.WorkWHRElMech + r.WorkWHRMech; + + if (runData.BusAuxiliaries != null) { + var workBusAuxPSCompOff = modData.EnergyPneumaticCompressorPowerOff(); + var workBusAuxPSCompOn = modData.EnergyPneumaticCompressorAlwaysOn(); + var airBusAuxPSON = modData.AirGeneratedAlwaysOn(); + var deltaAir = modData.AirConsumed() - modData.AirGenerated(); + + var kAir = (workBusAuxPSCompOn - workBusAuxPSCompOff) / (airBusAuxPSON - 0.SI<NormLiter>()); + r.WorkBusAuxPSCorr = (kAir * deltaAir).Cast<WattSecond>(); + + var workBusAuxES = modData.EnergyBusAuxESConsumed() - modData.EnergyBusAuxESGenerated(); + r.WorkBusAuxESMech = workBusAuxES / + runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / + runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; + + } else { + r.WorkBusAuxPSCorr = 0.SI<WattSecond>(); + r.WorkBusAuxESMech = 0.SI<WattSecond>(); + } + + var engineWasteheatSum = modData.FuelData.Aggregate( + 0.SI<Joule>(), + (current, fuel) => current + modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel) * + fuel.LowerHeatingValueVecto); + + r.AuxHeaterDemand = modData.AuxHeaterDemandCalc == null + ? 0.SI<Joule>() + : modData.AuxHeaterDemandCalc(duration, engineWasteheatSum); + + var kilogramCO2PerMeter = 0.SI<KilogramPerMeter>(); + + var firstFuel = true; + foreach (var fuel in modData.FuelData) { + var f = new FuelConsumptionCorrection(); + f.Fuel = fuel; + f.Distance = distance != null && distance.IsGreater(0) ? distance : null; + f.Duration = duration != null && duration.IsGreater(0) ? duration : null; + + f.EngineLineCorrectionFactor = modData.EngineLineCorrectionFactor(fuel); + f.VehicleLine = modData.VehicleLineSlope(fuel); + + f.FcModSum = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel); + + f.FcEssCorr = f.FcModSum + f.EngineLineCorrectionFactor * r.WorkESS; + f.FcBusAuxPsCorr = f.FcEssCorr + f.EngineLineCorrectionFactor * r.WorkBusAuxPSCorr; + f.FcBusAuxEsCorr = f.FcBusAuxPsCorr + f.EngineLineCorrectionFactor * r.WorkBusAuxESMech; + f.FcWHRCorr = f.FcBusAuxEsCorr + f.EngineLineCorrectionFactor * r.WorkWHR; + f.FcAuxHtr = 0.SI<Kilogram>(); + if (firstFuel) { + firstFuel = false; + f.FcAuxHtr = r.AuxHeaterDemand / fuel.LowerHeatingValueVecto; + } + f.FcAuxHtrCorr = f.FcWHRCorr + f.FcAuxHtr; + f.FcFinal = f.FcAuxHtrCorr; + + kilogramCO2PerMeter += distance == null || distance.IsEqual(0) + ? 0.SI<KilogramPerMeter>() + : f.FcFinal * fuel.CO2PerFuelWeight / distance; + //-- + + r.FuelCorrection[fuel.FuelType] = f; + } + + r.KilogramCO2PerMeter = kilogramCO2PerMeter; + return r; + } + + #endregion + } + + + public class CorrectedModalData : ICorrectedModalData + { + public Dictionary<FuelType, IFuelConsumptionCorrection> FuelCorrection { get; } + #region Implementation of ICorrectedModalData + + public CorrectedModalData() + { + FuelCorrection = new Dictionary<FuelType, IFuelConsumptionCorrection>(); + } + + public WattSecond WorkESS { get; set; } + public WattSecond WorkWHREl { get; set; } + public WattSecond WorkWHRElMech { get; set; } + public WattSecond WorkWHRMech { get; set; } + public WattSecond WorkWHR + { + get { return WorkWHRElMech + WorkWHRMech; } + } + public WattSecond WorkBusAuxPSCorr { get; set; } + public WattSecond WorkBusAuxESMech { get; set; } + public WattSecond WorkBusAuxCorr + { + get { return WorkBusAuxPSCorr + WorkBusAuxESMech; } + } + + public Joule AuxHeaterDemand { get; set; } + public KilogramPerMeter KilogramCO2PerMeter { get; set; } + + public IFuelConsumptionCorrection FuelConsumptionCorrection(IFuelProperties fuel) + { + if (!FuelCorrection.ContainsKey(fuel.FuelType)) { + throw new VectoException("Invalid fuel {0}", fuel); + } + + return FuelCorrection[fuel.FuelType]; + } + + public Kilogram CO2Total + { + get + { + return FuelCorrection.Sum(x => x.Value.TotalFuelConsumptionCorrected * x.Value.Fuel.CO2PerFuelWeight); + } + } + + public Joule EnergyConsumptionTotal + { + get + { + return FuelCorrection.Sum(x => + x.Value.TotalFuelConsumptionCorrected * x.Value.Fuel.LowerHeatingValueVecto); + } + } + + #endregion + } + + public class FuelConsumptionCorrection : IFuelConsumptionCorrection + { + + public IFuelProperties Fuel { get; set; } + public Meter Distance { get; set; } + public Second Duration { get; set; } + + public Kilogram FcModSum { get; set; } + public Kilogram FcEssCorr { get; set; } + public Kilogram FcBusAuxPsCorr { get; set; } + public Kilogram FcBusAuxEsCorr { get; set; } + public Kilogram FcWHRCorr { get; set; } + public Kilogram FcAuxHtrCorr { get; set; } + public Kilogram FcAuxHtr { get; set; } + public Kilogram FcFinal { get; set; } + + #region Implementation of IFuelConsumptionCorrection + + public KilogramPerWattSecond EngineLineCorrectionFactor { get; set; } + public KilogramPerWattSecond VehicleLine { get; set; } + public KilogramPerSecond FC_ESS_CORR_H { get { return Duration != null ? (FcEssCorr / Duration) : null; } } + public KilogramPerSecond FC_BusAux_PS_CORR_H { get { return Duration != null ? (FcBusAuxPsCorr / Duration) : null; } } + public KilogramPerSecond FC_BusAux_ES_CORR_H { get { return Duration != null ? (FcBusAuxEsCorr / Duration) : null; } } + public KilogramPerSecond FC_WHR_CORR_H { get { return Duration != null ? (FcWHRCorr / Duration) : null; } } + public KilogramPerSecond FC_AUXHTR_H { get { return Duration != null ? (FcAuxHtr / Duration) : null; } } + public KilogramPerSecond FC_AUXHTR_H_CORR { get { return Duration != null ? (FcAuxHtrCorr / Duration) : null; } } + public KilogramPerSecond FC_FINAL_H { get { return Duration != null ? FcFinal / Duration : null; } } + + public KilogramPerMeter FC_ESS_CORR_KM { get { return Distance != null ? (FcEssCorr / Distance) : null; } } + public KilogramPerMeter FC_WHR_CORR_KM { get { return Distance != null ? (FcWHRCorr / Distance) : null; } } + public KilogramPerMeter FC_BusAux_PS_CORR_KM { get { return Distance != null ? (FcBusAuxPsCorr / Distance) : null; } } + public KilogramPerMeter FC_BusAux_ES_CORR_KM { get { return Distance != null ? (FcBusAuxEsCorr / Distance) : null; } } + public KilogramPerMeter FC_AUXHTR_KM { get { return Distance != null ? (FcAuxHtr / Distance) : null; } } + public KilogramPerMeter FC_AUXHTR_KM_CORR { get { return Distance != null ? (FcAuxHtrCorr / Distance) : null; } } + public KilogramPerMeter FC_FINAL_KM { get { return Distance != null ? FcFinal / Distance : null; } } + + public VolumePerMeter FuelVolumePerMeter + { + get + { + return Fuel.FuelDensity != null && Distance != null + ? (FcFinal / Distance / Fuel.FuelDensity).Cast<VolumePerMeter>() + : null; + } + } + + public Kilogram TotalFuelConsumptionCorrected + { + get { return FcFinal; } + } + + public Joule EnergyDemand + { + get { return FcFinal * Fuel.LowerHeatingValueVecto; } + } + #endregion + } + +} \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index f8e8f1dab4b23db70009be1cfd935a470949ef6a..08e55b993c47d20773ff0c5d64fe5e774382c2e6 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -174,7 +174,7 @@ namespace TUGraz.VectoCore.OutputData Fields.CARGO_VOLUME, Fields.TIME, Fields.DISTANCE, Fields.SPEED, Fields.ALTITUDE_DELTA, }.Select(x => new DataColumn(x, typeof(ConvertedSI))).ToArray()); - + Table.Columns.AddRange( new[] { Fields.CO2_KM, Fields.CO2_TKM, Fields.CO2_M3KM, Fields.CO2_PKM, Fields.P_WHEEL, Fields.P_WHEEL_POS, Fields.P_FCMAP, Fields.P_FCMAP_POS, @@ -256,7 +256,7 @@ namespace TUGraz.VectoCore.OutputData { foreach (var entry in modDataFuelData) { foreach (var column in fcColumns.Reverse()) { - var colName = string.Format(column, modDataFuelData.Count <= 1 && !engineDataMultipleEngineFuelModes ? "" : "_" +entry.FuelType.GetLabel()); + var colName = string.Format(column, modDataFuelData.Count <= 1 && !engineDataMultipleEngineFuelModes ? "" : "_" + entry.FuelType.GetLabel()); if (!Table.Columns.Contains(colName)) { var col = new DataColumn(colName, typeof(ConvertedSI)); Table.Columns.Add(col); @@ -374,67 +374,24 @@ namespace TUGraz.VectoCore.OutputData WriteGearshiftStats(modData, row, gearCount); } - + private void WriteFuelconsumptionEntries( - IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, + IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, CubicMeter cargoVolume, double? passengers, VectoRunData runData) { var multipleEngineModes = runData.EngineData.MultipleEngineFuelModes; var vtpCycle = runData.Cycle.CycleType == CycleType.VTP; - var workESS = modData.WorkAuxiliariesDuringEngineStop() + - modData.WorkEngineStart(); - - var workWHREl = modData.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr); - var workWhrElMech = - workWHREl / DeclarationData.AlternaterEfficiency; - - var workWHRMech = -modData.TimeIntegral<WattSecond>(ModalResultField.P_WHR_mech_corr); - - var workWhr = workWhrElMech + workWHRMech; - - row[Fields.E_WHR_EL] = workWHREl.ConvertToKiloWattHour(); - row[Fields.E_WHR_MECH] = workWHRMech.ConvertToKiloWattHour(); - - var workBusAuxPSCorr = 0.SI<WattSecond>(); - var workBusAuxESMech = 0.SI<WattSecond>(); - if (runData.BusAuxiliaries != null) { - var workBusAuxPSCompOff = modData.EnergyPneumaticCompressorPowerOff(); - var workBusAuxPSCompOn = modData.EnergyPneumaticCompressorAlwaysOn(); - var airBusAuxPSON = modData.AirGeneratedAlwaysOn(); - var deltaAir = modData.AirConsumed() - modData.AirGenerated(); - - var kAir = (workBusAuxPSCompOn - workBusAuxPSCompOff) / (airBusAuxPSON - 0.SI<NormLiter>()); - workBusAuxPSCorr = (kAir * deltaAir).Cast<WattSecond>(); - - var workBusAuxES = modData.EnergyBusAuxESConsumed() - modData.EnergyBusAuxESGenerated(); - workBusAuxESMech = workBusAuxES / - runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / - runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; - - - } - row[Fields.E_BusAux_PS_corr] = workBusAuxPSCorr.ConvertToKiloWattHour(); - row[Fields.E_BusAux_ES_mech_corr] = workBusAuxESMech.ConvertToKiloWattHour(); - - var distance = modData.Distance; - var duration = modData.Duration; - - var kilogramCO2PerMeter = 0.SI<KilogramPerMeter>(); - + + row[Fields.E_WHR_EL] = modData.CorrectedModalData.WorkWHREl.ConvertToKiloWattHour(); + row[Fields.E_WHR_MECH] = modData.CorrectedModalData.WorkWHRMech.ConvertToKiloWattHour(); - var engineWasteheatSum = modData.FuelData.Aggregate( - 0.SI<Joule>(), - (current, fuel) => current + modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel) * - fuel.LowerHeatingValueVecto); + row[Fields.E_BusAux_PS_corr] = modData.CorrectedModalData.WorkBusAuxPSCorr.ConvertToKiloWattHour(); + row[Fields.E_BusAux_ES_mech_corr] = modData.CorrectedModalData.WorkBusAuxESMech.ConvertToKiloWattHour(); - var auxHeaterDemand = modData.AuxHeaterDemandCalc == null - ? 0.SI<Joule>() - : modData.AuxHeaterDemandCalc(duration, engineWasteheatSum); + row[Fields.E_BusAux_AuxHeater] = modData.CorrectedModalData.AuxHeaterDemand.Cast<WattSecond>().ConvertToKiloWattHour(); - row[Fields.E_BusAux_AuxHeater] = auxHeaterDemand.Cast<WattSecond>().ConvertToKiloWattHour(); - - var firstFuel = true; foreach (var fuel in modData.FuelData) { var suffix = modData.FuelData.Count <= 1 && !multipleEngineModes ? "" : "_" + fuel.FuelType.GetLabel(); @@ -459,76 +416,54 @@ namespace TUGraz.VectoCore.OutputData row[FcCol(Fields.FCESS_KM, suffix)] = modData.FuelConsumptionPerMeter(ModalResultField.FCICEStopStart, fuel) ?.ConvertToGrammPerKiloMeter(); - var fcModSum = modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel); + var fuelConsumption = modData.CorrectedModalData.FuelConsumptionCorrection(fuel); - var correction = modData.EngineLineCorrectionFactor(fuel); - - row[FcCol(Fields.K_ENGLINE, suffix)] = correction.ConvertToGramPerKiloWattHour(); + row[FcCol(Fields.K_ENGLINE, suffix)] = fuelConsumption.EngineLineCorrectionFactor.ConvertToGramPerKiloWattHour(); + row[FcCol(Fields.K_VEHLINE, suffix)] = fuelConsumption.VehicleLine?.ConvertToGramPerKiloWattHour(); var vehLine = modData.VehicleLineSlope(fuel); if (vehLine != null) { row[FcCol(Fields.K_VEHLINE, suffix)] = vehLine.ConvertToGramPerKiloWattHour(); } - var fcEssCorr = fcModSum + correction * workESS; - row[FcCol(Fields.FCESS_H_CORR, suffix)] = duration != null ? (fcEssCorr / duration).ConvertToGrammPerHour() : null; + row[FcCol(Fields.FCESS_H_CORR, suffix)] = fuelConsumption.FC_ESS_CORR_H?.ConvertToGrammPerHour(); + row[FcCol(Fields.FC_BusAux_PS_CORR_H, suffix)] = fuelConsumption.FC_BusAux_PS_CORR_H?.ConvertToGrammPerHour(); + row[FcCol(Fields.FC_BusAux_ES_CORR_H, suffix)] = fuelConsumption.FC_BusAux_ES_CORR_H; + row[FcCol(Fields.FCWHR_H_CORR, suffix)] = fuelConsumption.FC_WHR_CORR_H; + row[FcCol(Fields.FC_AUXHTR_H, suffix)] = fuelConsumption.FC_AUXHTR_H?.ConvertToGrammPerHour(); + row[FcCol(Fields.FC_AUXHTR_H_CORR, suffix)] = fuelConsumption.FC_AUXHTR_H_CORR?.ConvertToGrammPerHour(); - var fcBusAuxPSCorr = fcEssCorr + correction * workBusAuxPSCorr; - row[FcCol(Fields.FC_BusAux_PS_CORR_H, suffix)] = - duration != null ? (fcBusAuxPSCorr / duration).ConvertToGrammPerHour() : null; - var fcBusAuxESCorr = fcBusAuxPSCorr + correction * workBusAuxESMech; - row[FcCol(Fields.FC_BusAux_ES_CORR_H, suffix)] = - duration != null ? (fcBusAuxESCorr / duration).ConvertToGrammPerHour() : null; + row[FcCol(Fields.FCFINAL_H, suffix)] = fuelConsumption.FC_FINAL_H?.ConvertToGrammPerHour(); - var fcWHRCorr = fcBusAuxESCorr + correction * workWhr; - row[FcCol(Fields.FCWHR_H_CORR, suffix)] = duration != null ? (fcWHRCorr / duration).ConvertToGrammPerHour() : null; + row[FcCol(Fields.FCWHR_KM_CORR, suffix)] = fuelConsumption.FC_WHR_CORR_KM?.ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FC_BusAux_PS_CORR_KM, suffix)] = fuelConsumption.FC_BusAux_PS_CORR_KM?.ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FC_BusAux_ES_CORR_KM, suffix)] = fuelConsumption.FC_BusAux_ES_CORR_KM?.ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FC_AUXHTR_KM, suffix)] = fuelConsumption.FC_AUXHTR_KM?.ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FC_AUXHTR_KM_CORR, suffix)] = fuelConsumption.FC_AUXHTR_KM_CORR?.ConvertToGrammPerKiloMeter(); - var fcAuxHtr = 0.SI<Kilogram>(); - if (firstFuel) { - firstFuel = false; - fcAuxHtr = auxHeaterDemand / fuel.LowerHeatingValueVecto; - } - var fcAuxHtrCorr = fcWHRCorr + fcAuxHtr; - - var fcFinal = fcAuxHtrCorr; - - row[FcCol(Fields.FC_AUXHTR_H, suffix)] = (fcAuxHtr / duration).ConvertToGrammPerHour(); - row[FcCol(Fields.FC_AUXHTR_H_CORR, suffix)] = (fcAuxHtrCorr / duration).ConvertToGrammPerHour(); - - row[FcCol(Fields.FCFINAL_H, suffix)] = (fcFinal / duration).ConvertToGrammPerHour(); - - if (distance != null && distance.IsGreater(0)) { - row[FcCol(Fields.FCWHR_KM_CORR, suffix)] = (fcWHRCorr / distance).ConvertToGrammPerKiloMeter(); - row[FcCol(Fields.FC_BusAux_PS_CORR_KM, suffix)] = (fcBusAuxPSCorr / distance).ConvertToGrammPerKiloMeter(); - row[FcCol(Fields.FC_BusAux_ES_CORR_KM, suffix)] = (fcBusAuxESCorr / distance).ConvertToGrammPerKiloMeter(); - row[FcCol(Fields.FC_AUXHTR_KM, suffix)] = (fcAuxHtr / distance).ConvertToGrammPerKiloMeter(); - row[FcCol(Fields.FC_AUXHTR_KM_CORR, suffix)] = (fcAuxHtrCorr / distance).ConvertToGrammPerKiloMeter(); - - row[FcCol(Fields.FCESS_KM_CORR, suffix)] = (fcEssCorr / distance).ConvertToGrammPerKiloMeter(); - row[FcCol(Fields.FCFINAL_KM, suffix)] = (fcFinal / distance).ConvertToGrammPerKiloMeter(); - - if (fuel.FuelDensity != null) { - var fcVolumePerMeter = (fcFinal / distance / fuel.FuelDensity).Cast<VolumePerMeter>(); - - row[FcCol(Fields.FCFINAL_LITERPER100KM, suffix)] = fcVolumePerMeter.ConvertToLiterPer100Kilometer(); - if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcFinal != null) { - row[FcCol(Fields.FCFINAL_LITERPER100TKM, suffix)] = - (fcVolumePerMeter / vehicleLoading).ConvertToLiterPer100TonKiloMeter(); - } - if (cargoVolume > 0 && fcFinal != null) { - row[FcCol(Fields.FCFINAL_LiterPer100M3KM, suffix)] = - (fcVolumePerMeter / cargoVolume).ConvertToLiterPerCubicMeter100KiloMeter(); - } - - if (passengers != null) { - // subtract driver! - row[FcCol(Fields.FCFINAL_LiterPer100PassengerKM, suffix)] = - (fcVolumePerMeter / passengers.Value).ConvertToLiterPer100Kilometer(); - } + row[FcCol(Fields.FCESS_KM_CORR, suffix)] = fuelConsumption.FC_ESS_CORR_KM?.ConvertToGrammPerKiloMeter(); + row[FcCol(Fields.FCFINAL_KM, suffix)] = fuelConsumption.FC_FINAL_KM?.ConvertToGrammPerKiloMeter(); + + if (fuel.FuelDensity != null) { + + var fcVolumePerMeter = fuelConsumption.FuelVolumePerMeter; + row[FcCol(Fields.FCFINAL_LITERPER100KM, suffix)] = fcVolumePerMeter.ConvertToLiterPer100Kilometer(); + + if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { + row[FcCol(Fields.FCFINAL_LITERPER100TKM, suffix)] = + (fcVolumePerMeter / vehicleLoading).ConvertToLiterPer100TonKiloMeter(); + } + if (cargoVolume > 0) { + row[FcCol(Fields.FCFINAL_LiterPer100M3KM, suffix)] = + (fcVolumePerMeter / cargoVolume).ConvertToLiterPerCubicMeter100KiloMeter(); } - kilogramCO2PerMeter += fcFinal * fuel.CO2PerFuelWeight / distance; + if (passengers != null) { + // subtract driver! + row[FcCol(Fields.FCFINAL_LiterPer100PassengerKM, suffix)] = + (fcVolumePerMeter / passengers.Value).ConvertToLiterPer100Kilometer(); + } } if (vtpCycle) { @@ -537,17 +472,17 @@ namespace TUGraz.VectoCore.OutputData } } - - row[Fields.CO2_KM] = kilogramCO2PerMeter.ConvertToGrammPerKiloMeter(); + + row[Fields.CO2_KM] = modData.CorrectedModalData.KilogramCO2PerMeter.ConvertToGrammPerKiloMeter(); if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { - row[Fields.CO2_TKM] = (kilogramCO2PerMeter / vehicleLoading).ConvertToGrammPerTonKilometer(); + row[Fields.CO2_TKM] = (modData.CorrectedModalData.KilogramCO2PerMeter / vehicleLoading).ConvertToGrammPerTonKilometer(); } if (cargoVolume > 0) { - row[Fields.CO2_M3KM] = (kilogramCO2PerMeter / cargoVolume).ConvertToGrammPerCubicMeterKiloMeter(); + row[Fields.CO2_M3KM] = (modData.CorrectedModalData.KilogramCO2PerMeter / cargoVolume).ConvertToGrammPerCubicMeterKiloMeter(); } if (passengers != null) { - row[Fields.CO2_PKM] = (kilogramCO2PerMeter / passengers.Value).ConvertToGrammPerKiloMeter(); + row[Fields.CO2_PKM] = (modData.CorrectedModalData.KilogramCO2PerMeter / passengers.Value).ConvertToGrammPerKiloMeter(); } } @@ -726,7 +661,7 @@ namespace TUGraz.VectoCore.OutputData var emColumns = new List<Tuple<string, ConvertedSI>>() { Tuple.Create(Fields.EM_AVG_SPEED_FORMAT, modData.ElectricMotorAverageSpeed(em.Item1).ConvertToRoundsPerMinute()), - Tuple.Create(Fields.E_EM_Mot_DRIVE_FORMAT, modData.TotalElectricMotorMotWorkDrive(em.Item1).ConvertToKiloWattHour()), + Tuple.Create(Fields.E_EM_Mot_DRIVE_FORMAT, modData.TotalElectricMotorMotWorkDrive(em.Item1).ConvertToKiloWattHour()), Tuple.Create(Fields.E_EM_Mot_GENERATE_FORMAT, modData.TotalElectricMotorMotWorkRecuperate(em.Item1).ConvertToKiloWattHour()), Tuple.Create(Fields.ETA_EM_Mot_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorMotEfficiencyDrive(em.Item1), "")), @@ -735,10 +670,10 @@ namespace TUGraz.VectoCore.OutputData Tuple.Create(Fields.E_EM_DRIVE_FORMAT, modData.TotalElectricMotorWorkDrive(em.Item1).ConvertToKiloWattHour()), Tuple.Create(Fields.E_EM_GENERATE_FORMAT, modData.TotalElectricMotorWorkRecuperate(em.Item1).ConvertToKiloWattHour()), - + Tuple.Create(Fields.ETA_EM_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyDrive(em.Item1), "")), Tuple.Create(Fields.ETA_EM_GEN_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyGenerate(em.Item1), "")), - + Tuple.Create(Fields.E_EM_OFF_Loss_Format, modData.ElectricMotorOffLosses(em.Item1).ConvertToKiloWattHour()), Tuple.Create(Fields.E_EM_LOSS_TRANSM_FORMAT, modData.ElectricMotorTransmissionLosses(em.Item1).ConvertToKiloWattHour()), Tuple.Create(Fields.E_EM_Mot_LOSS_FORMAT, modData.ElectricMotorMotLosses(em.Item1).ConvertToKiloWattHour()), @@ -786,7 +721,7 @@ namespace TUGraz.VectoCore.OutputData } if (runData.BatteryData != null) { - row[Fields.REESS_StartSoC] = runData.BatteryData.InitialSoC * 100; + row[Fields.REESS_StartSoC] = runData.BatteryData.InitialSoC * 100; row[Fields.REESS_EndSoC] = modData.REESSEndSoC(); row[Fields.REESS_DeltaSoC] = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName()) .ConvertToKiloWattHour(); @@ -1183,7 +1118,7 @@ namespace TUGraz.VectoCore.OutputData public const string FCFINAL_LiterPer100PassengerKM = "FC-Final{0} [l/100Pkm]"; public const string ElectricEnergyConsumptionPerKm = "EC_el_final [kWh/km]"; - + public const string CO2_KM = "CO2 [g/km]"; public const string CO2_TKM = "CO2 [g/tkm]"; public const string CO2_M3KM = "CO2 [g/m³km]"; @@ -1332,7 +1267,7 @@ namespace TUGraz.VectoCore.OutputData public const string E_EM_LOSS_TRANSM_FORMAT = "E_EM_{0}_transm_loss [kWh]"; public const string E_EM_Mot_LOSS_FORMAT = "E_EM_{0}-em_loss [kWh]"; public const string E_EM_LOSS_FORMAT = "E_EM_{0}_loss [kWh]"; - public const string E_EM_OFF_TIME_SHARE = "EM {0} off time share [%]"; + public const string E_EM_OFF_TIME_SHARE = "EM {0} off time share [%]"; public const string REESS_CAPACITY = "REESS Capacity"; public const string REESS_StartSoC = "REESS Start SoC [%]"; diff --git a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs index 9a19997d1985c46a502c84ab06e2fbe7854b83c7..878ed5965fdfc6ca755eb83b4fbebd650550f13b 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLDeclarationReport.cs @@ -92,7 +92,7 @@ namespace TUGraz.VectoCore.OutputData.XML public Kilogram CO2Total { get; private set; } - public Dictionary<FuelType, Kilogram> FuelConsumptionFinal { get; private set; } + public Dictionary<FuelType, IFuelConsumptionCorrection> FuelConsumptionFinal { get; private set; } public Meter Distance { get; private set; } @@ -156,47 +156,9 @@ namespace TUGraz.VectoCore.OutputData.XML EngineSpeedDrivingMax = entriesDriving.Max(x => x.nEng); Distance = data.Distance; - var workESS = data.WorkAuxiliariesDuringEngineStop() + data.WorkEngineStart(); - var workWHR = WorkWHRCorrection(data); - - var workBusAuxCorr = 0.SI<WattSecond>(); - if (runData.BusAuxiliaries != null) { - workBusAuxCorr = WorkBusAuxCorrection(runData, data); - } - - - FuelConsumptionFinal = new Dictionary<FuelType, Kilogram>(); - CO2Total = 0.SI<Kilogram>(); - EnergyConsumptionTotal = 0.SI<Joule>(); - - var engineWasteheatSum = data.FuelData.Aggregate( - 0.SI<Joule>(), - (current, fuel) => current + data.TotalFuelConsumption(ModalResultField.FCFinal, fuel) * - fuel.LowerHeatingValueVecto); - - var auxHeaterDemand = data.AuxHeaterDemandCalc == null - ? 0.SI<Joule>() - : data.AuxHeaterDemandCalc(data.Duration, engineWasteheatSum); - - var firstFuel = true; - foreach (var entry in data.FuelData) { - var col = data.GetColumnName(entry, ModalResultField.FCFinal); - var fcSum = data.TimeIntegral<Kilogram>(col); - - var correction = 0.SI<KilogramPerWattSecond>(); - if (!(workWHR + workESS + workBusAuxCorr).IsEqual(0)) { - correction = data.EngineLineCorrectionFactor(entry); - } - var fcAuxHtr = 0.SI<Kilogram>(); - if (firstFuel) { - firstFuel = false; - fcAuxHtr = auxHeaterDemand / entry.LowerHeatingValueVecto; - } - var fcTotalcorr = fcSum + correction * (workESS + workWHR + workBusAuxCorr) + fcAuxHtr; - FuelConsumptionFinal[entry.FuelType] = fcTotalcorr; - CO2Total += fcTotalcorr * entry.CO2PerFuelWeight; - EnergyConsumptionTotal += fcTotalcorr * entry.LowerHeatingValueVecto; - } + FuelConsumptionFinal = data.CorrectedModalData.FuelCorrection; + CO2Total = data.CorrectedModalData.CO2Total; + EnergyConsumptionTotal = data.CorrectedModalData.EnergyConsumptionTotal; var gbxOutSignal = runData.Retarder.Type == RetarderType.TransmissionOutputRetarder ? ModalResultField.P_retarder_in @@ -214,34 +176,6 @@ namespace TUGraz.VectoCore.OutputData.XML PrimaryResult = runData.PrimaryResult; } - private static WattSecond WorkWHRCorrection(IModalDataContainer data) - { - var workWHRel = data.TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr); - var workWHRelMech = -workWHRel / DeclarationData.AlternaterEfficiency; - - var workWHRmech = -data.TimeIntegral<WattSecond>(ModalResultField.P_WHR_mech_corr); - - var workWHR = workWHRelMech + workWHRmech; - return workWHR; - } - - private static WattSecond WorkBusAuxCorrection(VectoRunData runData, IModalDataContainer data) - { - var workBusAuxPSCompOff = data.EnergyPneumaticCompressorPowerOff(); - var workBusAuxPSCompOn = data.EnergyPneumaticCompressorAlwaysOn(); - var airBusAuxPSON = data.AirGeneratedAlwaysOn(); - var deltaAir = data.AirConsumed() - data.AirGenerated(); - - var kAir = (workBusAuxPSCompOn - workBusAuxPSCompOff) / (airBusAuxPSON - 0.SI<NormLiter>()); - var workBusAuxPSCorr = (kAir * deltaAir).Cast<WattSecond>(); - - var workBusAuxES = data.EnergyBusAuxESConsumed() - data.EnergyBusAuxESGenerated(); - - var workBusAuxESMech = workBusAuxES / - runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) / - runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorGearEfficiency; - return workBusAuxPSCorr + workBusAuxESMech; - } } @@ -362,23 +296,24 @@ namespace TUGraz.VectoCore.OutputData.XML var retVal = new List<XElement>(); foreach (var fuel in result.FuelData) { + var entry = result.FuelConsumptionFinal[fuel.FuelType]; var fcResult = new XElement(tns + XMLNames.Report_Results_Fuel, new XAttribute(XMLNames.Report_Results_Fuel_Type_Attr, fuel.FuelType.ToXMLFormat())); fcResult.Add( new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/km"), - (result.FuelConsumptionFinal[fuel.FuelType] / result.Distance) + entry.FC_FINAL_KM .ConvertToGrammPerKiloMeter().ToMinSignificantDigits(3, 1)), new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"), - (result.FuelConsumptionFinal[fuel.FuelType] / result.Distance / result.Payload) + (entry.FC_FINAL_KM / result.Payload) .ConvertToGrammPerTonKilometer().ToMinSignificantDigits(3, 1)), result.CargoVolume > 0 ? new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/m³-km"), - (result.FuelConsumptionFinal[fuel.FuelType].ConvertToGramm() / result.Distance.ConvertToKiloMeter() / + (entry.TotalFuelConsumptionCorrected.ConvertToGramm() / result.Distance.ConvertToKiloMeter() / result.CargoVolume) .Value().ToMinSignificantDigits(3, 1)) : null, @@ -386,7 +321,7 @@ namespace TUGraz.VectoCore.OutputData.XML ? new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/p-km"), - (result.FuelConsumptionFinal[fuel.FuelType].ConvertToGramm() / result.Distance.ConvertToKiloMeter() / + (entry.TotalFuelConsumptionCorrected.ConvertToGramm() / result.Distance.ConvertToKiloMeter() / result.PassengerCount.Value).ToMinSignificantDigits(3, 1)) : null ); @@ -398,13 +333,13 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"), - (result.FuelConsumptionFinal[fuel.FuelType] * fuel.LowerHeatingValueVecto / + (entry.EnergyDemand / result.Distance.ConvertToKiloMeter() / 1e6) .Value().ToMinSignificantDigits(3, 1)), new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/t-km"), - (result.FuelConsumptionFinal[fuel.FuelType] * fuel.LowerHeatingValueVecto / + (entry.EnergyDemand / result.Distance.ConvertToKiloMeter() / result.Payload.ConvertToTon() / 1e6) .Value().ToMinSignificantDigits(3, 1))); if (result.CargoVolume > 0) { @@ -412,7 +347,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/m³-km"), - (result.FuelConsumptionFinal[fuel.FuelType] * fuel.LowerHeatingValueVecto / + (entry.EnergyDemand / result.Distance.ConvertToKiloMeter() / result.CargoVolume / 1e6).Value().ToMinSignificantDigits(3, 1))); } if (result.PassengerCount.HasValue) { @@ -420,7 +355,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/p-km"), - (result.FuelConsumptionFinal[fuel.FuelType] * fuel.LowerHeatingValueVecto / + (entry.EnergyDemand / result.Distance.ConvertToKiloMeter() / result.PassengerCount.Value / 1e6).Value().ToMinSignificantDigits(3, 1)) ); } @@ -430,13 +365,13 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/100km"), - (result.FuelConsumptionFinal[fuel.FuelType].ConvertToGramm() / fuel.FuelDensity / + (entry.TotalFuelConsumptionCorrected.ConvertToGramm() / fuel.FuelDensity / result.Distance.ConvertToKiloMeter() * 100) .Value().ToMinSignificantDigits(3, 1)), new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/t-km"), - (result.FuelConsumptionFinal[fuel.FuelType].ConvertToGramm() / fuel.FuelDensity / + (entry.TotalFuelConsumptionCorrected.ConvertToGramm() / fuel.FuelDensity / result.Distance.ConvertToKiloMeter() / result.Payload.ConvertToTon()).Value().ToMinSignificantDigits(3, 1))); if (result.CargoVolume > 0) { @@ -444,7 +379,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/m³-km"), - (result.FuelConsumptionFinal[fuel.FuelType].ConvertToGramm() / fuel.FuelDensity / + (entry.TotalFuelConsumptionCorrected.ConvertToGramm() / fuel.FuelDensity / result.Distance.ConvertToKiloMeter() / result.CargoVolume).Value().ToMinSignificantDigits(3, 1))); } @@ -453,7 +388,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Results_FuelConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "l/p-km"), - (result.FuelConsumptionFinal[fuel.FuelType].ConvertToGramm() / fuel.FuelDensity / + (entry.TotalFuelConsumptionCorrected.ConvertToGramm() / fuel.FuelDensity / result.Distance.ConvertToKiloMeter() / result.PassengerCount.Value).Value().ToMinSignificantDigits(3, 1)) ); } diff --git a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs index b70fecc106ca097a4fb83546707ce054cdb02d00..d79466d8bd9afa212ed19f924e5fbae21daf50c4 100644 --- a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs +++ b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs @@ -428,7 +428,7 @@ namespace TUGraz.VectoCore.OutputData.XML new XElement( tns + XMLNames.Report_Result_EnergyConsumption, new XAttribute(XMLNames.Report_Results_Unit_Attr, "MJ/km"), - (result.FuelConsumptionFinal[fuel.FuelType] * fuel.LowerHeatingValueVecto / + (result.FuelConsumptionFinal[fuel.FuelType].EnergyDemand / result.Distance.ConvertToKiloMeter() / 1e6) .Value().ToMinSignificantDigits(5, 5))); retVal.Add(fcResult); diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 66111692ea318833e4bc357ddb2c2832d11a3b96..af898f628fc08a346901ab89c80634e5d3bf0c33 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -435,6 +435,7 @@ <Compile Include="Models\Simulation\SimulationFactoryNinjectModule.cs" /> <Compile Include="OutputData\FileIO\BusAuxWriter.cs" /> <Compile Include="OutputData\FileIO\JSONFileWriter.cs" /> + <Compile Include="OutputData\ModalDataPostprocessingCorrection.cs" /> <Compile Include="OutputData\XML\AbstractXMLManufacturerReport.cs" /> <Compile Include="OutputData\XML\DeclarationJobs\XMLCompletedBusWriter.cs" /> <Compile Include="OutputData\XML\Engineering\Factory\EngineeringWriterFactory.cs" /> diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index c1d923b5ebdaecdd6ae8eed407a1b0a9b00c249f..823dfe2b31882809a7fcaaab7be5509df0dda699 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -351,6 +351,8 @@ namespace TUGraz.VectoCore.Tests.Utils throw new NotImplementedException(); } + public ICorrectedModalData CorrectedModalData { get; } + public WattSecond REESSEnergyEnd() { throw new NotImplementedException();