From 56385b2b6f327a661d1dc23aa469725edb802b65 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Wed, 6 Jul 2022 21:34:30 +0200 Subject: [PATCH] adding more writer functions for summary data registering components with sum-data to add component-specific columns adding component-specific columns in sum-data make auxiliary component register aux with mod-data and sum-data --- .../Models/Simulation/IVehicleContainer.cs | 1 + .../Simulation/Impl/PowertrainBuilder.cs | 59 +- .../Simulation/Impl/VehicleContainer.cs | 3 +- .../Impl/EngineAuxiliary.cs | 8 +- .../VectoCore/OutputData/SumDataFields.cs | 374 ++++- .../OutputData/SummaryDataContainer.cs | 1276 ++++++----------- .../Utils/MockVehicleContainer.cs | 2 + 7 files changed, 840 insertions(+), 883 deletions(-) diff --git a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs index 7adcd272a1..6000d8386c 100644 --- a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs @@ -79,6 +79,7 @@ namespace TUGraz.VectoCore.Models.Simulation void StartSimulationRun(); IEnumerable<ISimulationPreprocessor> GetPreprocessingRuns { get; } + ISumData SumData { get; } void AddPreprocessor(ISimulationPreprocessor simulationPreprocessor); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 54ced6f78a..10459d3335 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -102,7 +102,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } var container = new VehicleContainer(ExecutionMode.Engineering, modData, _sumWriter) { RunData = data }; - container.ModalData.AddAuxiliary(Constants.Auxiliaries.Cycle); + //container.ModalData.AddAuxiliary(Constants.Auxiliaries.Cycle); var cycle = new PowertrainDrivingCycle(container, data.Cycle); var engine = new EngineOnlyCombustionEngine(container, data.EngineData); @@ -221,10 +221,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl default: throw new ArgumentOutOfRangeException("AuxiliaryDemandType", auxData.DemandType.ToString()); } - container.ModalData?.AddAuxiliary(id); + //container.ModalData?.AddAuxiliary(id); + //container.SumData?.AddAuxiliary(id); } - - engine.Connect(aux.Port()); } @@ -233,18 +232,23 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var aux = CreateSpeedDependentAuxiliaries(data, container); var engineFan = new EngineFanAuxiliary(data.FanDataVTP.FanCoefficients.Take(3).ToArray(), data.FanDataVTP.FanDiameter); aux.AddCycle(Constants.Auxiliaries.IDs.Fan, cycleEntry => engineFan.PowerDemand(cycleEntry.FanSpeed)); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.Fan); + //container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.Fan); + //container.SumData?.AddAuxiliary(Constants.Auxiliaries.IDs.Fan); if (data.PTO != null) { aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission, - DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, + DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); + //container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, + // Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); + //container.SumData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission); aux.Add(Constants.Auxiliaries.IDs.PTOConsumer, - (n, absTime, dt, dryRun) => container.DrivingCycleInfo.PTOActive ? null : data.PTO.LossMap.GetTorqueLoss(n) * n); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer, + (n, absTime, dt, dryRun) => container.DrivingCycleInfo.PTOActive ? null : data.PTO.LossMap.GetTorqueLoss(n) * n, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); + //container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer, + // Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); + //container.SumData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer); } engine.Connect(aux.Port()); @@ -1443,7 +1447,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl throw new ArgumentOutOfRangeException("AuxiliaryDemandType", auxData.DemandType.ToString()); } - container.ModalData?.AddAuxiliary(id); + //container.ModalData?.AddAuxiliary(id); + //container.SumData?.AddAuxiliary(id); } RoadSweeperAuxiliary rdSwpAux = null; @@ -1454,8 +1459,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl throw new VectoSimulationException("PTO activity 'road sweeping' requested, but no min. engine speed or gear provided"); } rdSwpAux = new RoadSweeperAuxiliary(container); - aux.Add(Constants.Auxiliaries.IDs.PTORoadsweeping, (nEng, absTime, dt, dryRun) => rdSwpAux.PowerDemand(nEng, absTime, dt, dryRun)); - container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTORoadsweeping, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTORoadsweeping); + aux.Add(Constants.Auxiliaries.IDs.PTORoadsweeping, + (nEng, absTime, dt, dryRun) => rdSwpAux.PowerDemand(nEng, absTime, dt, dryRun), + Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTORoadsweeping); + //container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTORoadsweeping, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTORoadsweeping); + //container.SumData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTORoadsweeping); } if (data.ExecutionMode == ExecutionMode.Engineering && @@ -1465,19 +1473,28 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } ptoDrive = new PTODriveAuxiliary(container, data.PTOCycleWhileDrive); - aux.Add(Constants.Auxiliaries.IDs.PTODuringDrive, (nEng, absTime, dt, dryRun) => ptoDrive.PowerDemand(nEng, absTime, dt, dryRun)); - container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTODuringDrive, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTODuringDrive); + aux.Add(Constants.Auxiliaries.IDs.PTODuringDrive, + (nEng, absTime, dt, dryRun) => ptoDrive.PowerDemand(nEng, absTime, dt, dryRun), + Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTODuringDrive); + //container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTODuringDrive, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTODuringDrive); + //container.SumData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTODuringDrive); } if (data.PTO != null) { aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission, - DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand); - container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, - Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); + DeclarationData.PTOTransmission.Lookup(data.PTO.TransmissionType).PowerDemand, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); + //container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOTransmission, + // Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOTransmission); aux.Add(Constants.Auxiliaries.IDs.PTOConsumer, - (n, absTime, dt, dryRun) => container.DrivingCycleInfo.PTOActive || (rdSwpAux?.Active(absTime) ?? false) || (ptoDrive?.Active(absTime) ?? false) ? null : data.PTO.LossMap.GetTorqueLoss(n) * n); - container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer, - Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); + (n, absTime, dt, dryRun) => + container.DrivingCycleInfo.PTOActive || (rdSwpAux?.Active(absTime) ?? false) || + (ptoDrive?.Active(absTime) ?? false) + ? null + : data.PTO.LossMap.GetTorqueLoss(n) * n, + Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); + //container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer, + // Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTOConsumer); + //container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTOConsumer); } return aux; @@ -1502,7 +1519,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl throw new ArgumentOutOfRangeException("AuxiliaryDemandType", auxData.DemandType.ToString()); } - container.ModalData?.AddAuxiliary(id); + //container.ModalData?.AddAuxiliary(id); } return aux; diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index c542532f73..48c82b0a70 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -203,7 +203,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } if (WriteSumData != null) { - WriteSumData.RegisterComponent(component); + WriteSumData.RegisterComponent(component, RunData); } } @@ -239,6 +239,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } public virtual IEnumerable<ISimulationPreprocessor> GetPreprocessingRuns => new ReadOnlyCollection<ISimulationPreprocessor>(Preprocessors); + public ISumData SumData => WriteSumData; public virtual void AddPreprocessor(ISimulationPreprocessor simulationPreprocessor) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs index e7f82a552c..3f29f36024 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs @@ -70,9 +70,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> /// <param name="auxId"></param> /// <param name="powerDemand"></param> - public void AddConstant(string auxId, Watt powerDemand) + public void AddConstant(string auxId, Watt powerDemand, string columnName = null) { - Add(auxId, (nEng, absTime, dt, dryRun) => powerDemand); + Add(auxId, (nEng, absTime, dt, dryRun) => powerDemand, columnName); } /// <summary> @@ -95,9 +95,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> /// <param name="auxId"></param> /// <param name="powerLossFunction"></param> - public void Add(string auxId, Func<PerSecond, Second, Second, bool, Watt> powerLossFunction) + public void Add(string auxId, Func<PerSecond, Second, Second, bool, Watt> powerLossFunction, string columnName = null) { Auxiliaries[auxId] = powerLossFunction; + (DataBus as IVehicleContainer)?.ModalData?.AddAuxiliary(auxId, columnName); + (DataBus as IVehicleContainer)?.SumData?.AddAuxiliary(auxId); } public NewtonMeter Initialize(NewtonMeter torque, PerSecond angularSpeed) diff --git a/VectoCore/VectoCore/OutputData/SumDataFields.cs b/VectoCore/VectoCore/OutputData/SumDataFields.cs index b9a3676918..12749ac202 100644 --- a/VectoCore/VectoCore/OutputData/SumDataFields.cs +++ b/VectoCore/VectoCore/OutputData/SumDataFields.cs @@ -1,7 +1,16 @@ using System; using System.Collections.Generic; +using System.Data; using System.Diagnostics.CodeAnalysis; +using System.Linq; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data; namespace TUGraz.VectoCore.OutputData { @@ -290,6 +299,13 @@ namespace TUGraz.VectoCore.OutputData public delegate object WriteSumEntry(VectoRunData r, IModalDataContainer m); + public delegate object WriteFuelEntry(VectoRunData r, IModalDataContainer m, IFuelProperties f); + + public delegate object WriteEmEntry(VectoRunData r, IModalDataContainer m, PowertrainPosition emPos); + + + public delegate object WriteAuxEntry(VectoRunData r, IModalDataContainer m, DataColumn aux); + private static Tuple<ModalResultField[], WriteSumEntry> SumFunc(ModalResultField[] mrf, WriteSumEntry w) { return Tuple.Create(mrf, w); @@ -300,14 +316,362 @@ namespace TUGraz.VectoCore.OutputData return Tuple.Create<ModalResultField[], WriteSumEntry>(null, w); } + private static Tuple<ModalResultField[], WriteFuelEntry> FuelFunc(WriteFuelEntry w) + { + return Tuple.Create<ModalResultField[], WriteFuelEntry>(null, w); + } + public static readonly Dictionary<string, Tuple<ModalResultField[], WriteSumEntry>> SumDataValue = new Dictionary<string, Tuple<ModalResultField[], WriteSumEntry>>() { // common fields - {SumDataFields.SORT, SumFunc((r, m) => r.JobNumber * 1000 + r.RunNumber)}, - {SumDataFields.JOB, SumFunc((r, m) => $"{r.JobNumber}-{r.RunNumber}")}, - {SumDataFields.INPUTFILE, SumFunc((r,m) => SummaryDataContainer.ReplaceNotAllowedCharacters(r.JobName)) }, - // engine Infos - {SumDataFields.ENGINE_MANUFACTURER, SumFunc((r, m) => r.EngineData.Manufacturer)}, + { SORT, SumFunc((r, m) => r.JobNumber * 1000 + r.RunNumber)}, + { JOB, SumFunc((r, m) => $"{r.JobNumber}-{r.RunNumber}")}, + { INPUTFILE, SumFunc((r,m) => SummaryDataContainer.ReplaceNotAllowedCharacters(r.JobName)) }, + { CYCLE, SumFunc((r, m) => SummaryDataContainer.ReplaceNotAllowedCharacters(r.Cycle.Name + Constants.FileExtensions.CycleFile))}, + { STATUS, SumFunc((r, m) => m.RunStatus)}, + + { TIME, SumFunc((r,m) => (ConvertedSI)m.Duration)}, + { DISTANCE, SumFunc((r, m) => m.Distance.ConvertToKiloMeter())}, + { SPEED, SumFunc((r, m) => m.Speed().ConvertToKiloMeterPerHour())}, + { ALTITUDE_DELTA, SumFunc((r, m) => (ConvertedSI)m.AltitudeDelta())}, + + + // Vehicle + { VEHICLE_FUEL_TYPE, SumFunc((r, m) => m.FuelData.Select(x => x.GetLabel()).Join())}, + { P_WHEEL_POS, SumFunc((r, m) => m.PowerWheelPositive().ConvertToKiloWatt())}, + { P_WHEEL, SumFunc((r, m) => m.PowerWheel().ConvertToKiloWatt())}, + { VEHICLE_MANUFACTURER, SumFunc((r, m) => r.VehicleData.Manufacturer)}, + { VIN_NUMBER, SumFunc((r, m) => r.VehicleData.VIN)}, + { VEHICLE_MODEL, SumFunc((r, m) => r.VehicleData.ModelName)}, + { HDV_CO2_VEHICLE_CLASS, SumFunc((r, m) => r.Mission?.BusParameter?.BusGroup.GetClassNumber() ?? r.VehicleData.VehicleClass.GetClassNumber())}, + { CURB_MASS, SumFunc((r, m) => (ConvertedSI)r.VehicleData.CurbMass)}, + { LOADING, SumFunc((r, m) => (ConvertedSI)r.VehicleData.Loading)}, + { PassengerCount, SumFunc((r, m) => r.VehicleData.PassengerCount)}, + { CARGO_VOLUME, SumFunc((r, m) => (ConvertedSI)r.VehicleData.CargoVolume)}, + { TOTAL_VEHICLE_MASS, SumFunc((r, m) => (ConvertedSI)r.VehicleData.TotalVehicleMass)}, + { SLEEPER_CAB, SumFunc((r, m) => r.VehicleData.SleeperCab.HasValue ? (r.VehicleData.SleeperCab.Value ? "yes" : "no") : "-")}, + { ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, SumFunc((r, m) => r.VehicleData.RollResistanceCoefficientWithoutTrailer)}, + { ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, SumFunc((r, m) => r.VehicleData.TotalRollResistanceCoefficient)}, + { R_DYN, SumFunc((r, m) => (ConvertedSI)r.VehicleData.DynamicTyreRadius)}, + { ADAS_TECHNOLOGY_COMBINATION, SumFunc((r, m) => r.VehicleData.ADAS != null ? DeclarationData.ADASCombinations.Lookup(r.VehicleData.ADAS, r.GearboxData?.Type ?? GearboxType.NoGearbox).ID : "")}, + { REESS_CAPACITY, SumFunc((r, m) => r.BatteryData?.Capacity != null ? $"{r.BatteryData?.Capacity.AsAmpHour} Ah" : r.SuperCapData?.Capacity != null ? $"{r.SuperCapData.Capacity} F" : null)}, + { TCU_MODEL, SumFunc((r, m) => r.ShiftStrategy)}, + { PTO_TECHNOLOGY, SumFunc((r, m) => r.PTO?.TransmissionType ?? "")}, + + // air drag infos + { AIRDRAG_MODEL, SumFunc((r, m) => r.AirdragData.ModelName)}, + { AIRDRAG_CERTIFICATION_METHOD, SumFunc((r, m) => r.AirdragData.CertificationMethod.GetName())}, + { AIRDRAG_CERTIFICATION_NUMBER, SumFunc((r, m) => r.AirdragData.CertificationMethod == CertificationMethod.StandardValues ? "" : r.AirdragData.CertificationNumber)}, + { CD_x_A_DECLARED, SumFunc((r, m) => (ConvertedSI)r.AirdragData.DeclaredAirdragArea)}, + { CD_x_A, SumFunc((r, m) => (ConvertedSI)r.AirdragData.CrossWindCorrectionCurve.AirDragArea)}, + // engine infos + { ENGINE_MANUFACTURER, SumFunc((r, m) => r.EngineData.Manufacturer)}, + { ENGINE_MODEL, SumFunc((r, m) => r.EngineData.ModelName)}, + { ENGINE_CERTIFICATION_NUMBER, SumFunc((r, m) => r.EngineData.CertificationNumber)}, + { ENGINE_FUEL_TYPE, SumFunc((r, m) => r.EngineData.Fuels.Select(x => x.FuelData.GetLabel()).Join(" / "))}, + { ENGINE_RATED_POWER, SumFunc((r, m) => r.EngineData.RatedPowerDeclared != null && r.EngineData.RatedPowerDeclared > 0 ? r.EngineData.RatedPowerDeclared.ConvertToKiloWatt() : r.EngineData.FullLoadCurves[0].MaxPower.ConvertToKiloWatt())}, + { ENGINE_IDLING_SPEED, SumFunc((r, m) => (ConvertedSI)r.EngineData.IdleSpeed.AsRPM.SI<Scalar>())}, + { ENGINE_RATED_SPEED, SumFunc((r, m) => r.EngineData.RatedSpeedDeclared != null && r.EngineData.RatedSpeedDeclared > 0 ? (ConvertedSI)r.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>() : (ConvertedSI)r.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>())}, + { ENGINE_DISPLACEMENT, SumFunc((r, m) => r.EngineData.Displacement.ConvertToCubicCentiMeter())}, + { ENGINE_WHTC_URBAN, SumFunc((r, m) => r.EngineData.Fuels.Select(x => x.WHTCUrban).Join(" / "))}, + { ENGINE_WHTC_RURAL, SumFunc((r, m) => r.EngineData.Fuels.Select(x => x.WHTCRural).Join(" / "))}, + { ENGINE_WHTC_MOTORWAY, SumFunc((r, m) => r.EngineData.Fuels.Select(x => x.WHTCMotorway).Join(" / "))}, + { ENGINE_BF_COLD_HOT, SumFunc((r, m) => r.EngineData.Fuels.Select(x => x.ColdHotCorrectionFactor).Join(" / "))}, + { ENGINE_CF_REG_PER, SumFunc((r, m) => r.EngineData.Fuels.Select(x => x.CorrectionFactorRegPer).Join(" / "))}, + { ENGINE_ACTUAL_CORRECTION_FACTOR, SumFunc((r, m) => { + if (r.Mission?.MissionType == MissionType.VerificationTest) { + var fuelsWhtc = r.EngineData.Fuels.Select( + fuel => m.TimeIntegral<Kilogram>(m.GetColumnName(fuel.FuelData, ModalResultField.FCWHTCc)) / + m.TimeIntegral<Kilogram>(m.GetColumnName(fuel.FuelData, ModalResultField.FCMap))) + .Select(dummy => (double)dummy).ToArray(); + return fuelsWhtc.Join(" / "); + } + return r.EngineData.Fuels.Select(x => x.FuelConsumptionCorrectionFactor).Join(" / "); + })}, + + // axlegear infos + { AXLE_MANUFACTURER, SumFunc((r, m) => r.AxleGearData.Manufacturer)}, + { AXLE_MODEL, SumFunc((r, m) => r.AxleGearData.ModelName)}, + { AXLE_RATIO, SumFunc((r, m) => (ConvertedSI)r.AxleGearData.AxleGear.Ratio.SI<Scalar>())}, + { AXLEGEAR_CERTIFICATION_METHOD, SumFunc((r, m) => r.AxleGearData.CertificationMethod.GetName())}, + { AXLEGEAR_CERTIFICATION_NUMBER, SumFunc((r, m) => r.AxleGearData.CertificationMethod == CertificationMethod.StandardValues ? "" : r.AxleGearData.CertificationNumber)}, + + // axle/tyre infos + { NUM_AXLES_DRIVEN, SumFunc((r, m) => r.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven))}, + { NUM_AXLES_NON_DRIVEN, SumFunc((r, m) => r.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven))}, + { NUM_AXLES_TRAILER, SumFunc((r, m) => r.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer))}, + + { DECLARED_RRC_AXLE1, SumFunc((r, m) => r.VehicleData.AxleData.Count > 0 && r.VehicleData.AxleData[0].AxleType != AxleType.Trailer ? r.VehicleData.AxleData[0].RollResistanceCoefficient : double.NaN) }, + { DECLARED_RRC_AXLE2, SumFunc((r, m) => r.VehicleData.AxleData.Count > 1 && r.VehicleData.AxleData[1].AxleType != AxleType.Trailer ? r.VehicleData.AxleData[1].RollResistanceCoefficient : double.NaN) }, + { DECLARED_RRC_AXLE3, SumFunc((r, m) => r.VehicleData.AxleData.Count > 2 && r.VehicleData.AxleData[2].AxleType != AxleType.Trailer ? r.VehicleData.AxleData[2].RollResistanceCoefficient : double.NaN) }, + { DECLARED_RRC_AXLE4, SumFunc((r, m) => r.VehicleData.AxleData.Count > 3 && r.VehicleData.AxleData[3].AxleType != AxleType.Trailer ? r.VehicleData.AxleData[3].RollResistanceCoefficient : double.NaN) }, + + { DECLARED_FZISO_AXLE1, SumFunc((r, m) => r.VehicleData.AxleData.Count > 0 && r.VehicleData.AxleData[0].AxleType != AxleType.Trailer ? (ConvertedSI)r.VehicleData.AxleData[0].TyreTestLoad : null) }, + { DECLARED_FZISO_AXLE2, SumFunc((r, m) => r.VehicleData.AxleData.Count > 1 && r.VehicleData.AxleData[1].AxleType != AxleType.Trailer ? (ConvertedSI)r.VehicleData.AxleData[1].TyreTestLoad : null) }, + { DECLARED_FZISO_AXLE3, SumFunc((r, m) => r.VehicleData.AxleData.Count > 2 && r.VehicleData.AxleData[2].AxleType != AxleType.Trailer ? (ConvertedSI)r.VehicleData.AxleData[2].TyreTestLoad : null) }, + { DECLARED_FZISO_AXLE4, SumFunc((r, m) => r.VehicleData.AxleData.Count > 3 && r.VehicleData.AxleData[3].AxleType != AxleType.Trailer ? (ConvertedSI)r.VehicleData.AxleData[3].TyreTestLoad : null) }, + + // angle drive + { ANGLEDRIVE_MANUFACTURER, SumFunc((r, m) => r.AngledriveData?.Manufacturer ?? Constants.NOT_AVAILABLE)}, + { ANGLEDRIVE_MODEL, SumFunc((r, m) => r.AngledriveData?.ModelName?? Constants.NOT_AVAILABLE)}, + { ANGLEDRIVE_RATIO, SumFunc((r, m) => r.AngledriveData?.Angledrive.Ratio)}, + { ANGLEDRIVE_CERTIFICATION_METHOD, SumFunc((r, m) => r.AngledriveData?.CertificationMethod.GetName() ?? "")}, + { ANGLEDRIVE_CERTIFICATION_NUMBER, SumFunc((r, m) => r.AngledriveData == null || r.AngledriveData.CertificationMethod == CertificationMethod.StandardValues ? "" : r.AngledriveData.CertificationNumber)}, + + // retarder + { RETARDER_TYPE, SumFunc((r, m) => (r.Retarder?.Type ?? RetarderType.None).GetLabel())}, + { RETARDER_MANUFACTURER, SumFunc((r, m) => r.Retarder != null && r.Retarder.Type.IsDedicatedComponent() ? r.Retarder.Manufacturer : Constants.NOT_AVAILABLE)}, + { RETARDER_MODEL, SumFunc((r, m) => r.Retarder != null && r.Retarder.Type.IsDedicatedComponent() ? r.Retarder.ModelName : Constants.NOT_AVAILABLE)}, + { RETARDER_CERTIFICATION_METHOD, SumFunc((r, m) => r.Retarder != null && r.Retarder.Type.IsDedicatedComponent() ? r.Retarder?.CertificationMethod.GetName() : "")}, + { RETARDER_CERTIFICATION_NUMBER, SumFunc((r, m) => r.Retarder == null || !r.Retarder.Type.IsDedicatedComponent() || r.Retarder.CertificationMethod == CertificationMethod.StandardValues ? "" : r.Retarder.CertificationNumber)}, + + // gearbox + { GEARBOX_MANUFACTURER, SumFunc((r, m) => r.GearboxData.Manufacturer)}, + { GEARBOX_MODEL, SumFunc((r, m) => r.GearboxData.ModelName)}, + { GEARBOX_TYPE, SumFunc((r, m) => r.GearboxData.Type)}, + { GEARBOX_CERTIFICATION_NUMBER, SumFunc((r, m) => r.GearboxData.CertificationMethod == CertificationMethod.StandardValues ? "" : r.GearboxData.CertificationNumber)}, + { GEARBOX_CERTIFICATION_METHOD, SumFunc((r, m) => r.GearboxData.CertificationMethod.GetName())}, + + { GEAR_RATIO_FIRST_GEAR, SumFunc((r, m) => r.GearboxData.Gears.Count > 0 + ? (double.IsNaN(r.GearboxData.Gears.First().Value.Ratio) + ? (ConvertedSI)r.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>() + : (ConvertedSI)r.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()) + : 0.SI<Scalar>())}, + { GEAR_RATIO_LAST_GEAR, SumFunc((r, m) => r.GearboxData.Gears.Count > 0 + ? (ConvertedSI) r.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() + : (ConvertedSI)0.SI<Scalar>())}, + + // torque converter + { TORQUECONVERTER_MANUFACTURER, SumFunc((r, m) => r.GearboxData?.TorqueConverterData?.Manufacturer ?? Constants.NOT_AVAILABLE)}, + { TORQUECONVERTER_MODEL, SumFunc((r, m) => r.GearboxData?.TorqueConverterData?.ModelName ?? Constants.NOT_AVAILABLE)}, + { TORQUE_CONVERTER_CERTIFICATION_NUMBER, SumFunc((r, m) => r.GearboxData?.TorqueConverterData?.CertificationMethod == CertificationMethod.StandardValues ? "" : r.GearboxData?.TorqueConverterData?.CertificationNumber ?? "")}, + { TORQUE_CONVERTER_CERTIFICATION_METHOD, SumFunc((r, m) => r.GearboxData?.TorqueConverterData?.CertificationMethod.GetName() ?? "")}, + + // engine + { P_FCMAP_POS, SumFunc((r, m) => m.TotalPowerEnginePositiveAverage().ConvertToKiloWatt())}, + { P_FCMAP, SumFunc((r, m) => m.TotalPowerEngineAverage().ConvertToKiloWatt())}, + + { E_FCMAP_POS, SumFunc((r, m) => m.TotalEngineWorkPositive().ConvertToKiloWattHour())}, + { E_FCMAP_NEG, SumFunc((r, m) => (-m.TotalEngineWorkNegative()).ConvertToKiloWattHour())}, + { E_ICE_START, SumFunc((r, m) => m.WorkEngineStart().ConvertToKiloWattHour())}, + + { E_WHR_EL, SumFunc((r, m) => m.CorrectedModalData.WorkWHREl.ConvertToKiloWattHour())}, + { E_WHR_MECH, SumFunc((r, m) => m.CorrectedModalData.WorkWHRMech.ConvertToKiloWattHour())}, + { E_BusAux_PS_corr, SumFunc((r, m) => m.CorrectedModalData.WorkBusAuxPSCorr.ConvertToKiloWattHour())}, + { E_BusAux_ES_mech_corr, SumFunc((r, m) => m.CorrectedModalData.WorkBusAuxESMech.ConvertToKiloWattHour())}, + { E_BusAux_AuxHeater, SumFunc((r, m) => m.CorrectedModalData.AuxHeaterDemand.Cast<WattSecond>().ConvertToKiloWattHour())}, + + + { E_POWERTRAIN_INERTIA, SumFunc((r, m) => m.PowerAccelerations().ConvertToKiloWattHour())}, + + { E_AUX, SumFunc((r, m) => m.WorkAuxiliaries().ConvertToKiloWattHour())}, + { E_AUX_EL_HV, SumFunc((r, m) => m.TimeIntegral<WattSecond>(ModalResultField.P_aux_el).ConvertToKiloWattHour())}, + { E_CLUTCH_LOSS, SumFunc((r, m) => m.WorkClutch().ConvertToKiloWattHour())}, + { E_TC_LOSS, SumFunc((r, m) => m.WorkTorqueConverter().ConvertToKiloWattHour())}, + { E_SHIFT_LOSS, SumFunc((r, m) => m.WorkGearshift().ConvertToKiloWattHour())}, + { E_GBX_LOSS, SumFunc((r, m) => m.WorkGearbox().ConvertToKiloWattHour())}, + { E_RET_LOSS, SumFunc((r, m) => m.WorkRetarder().ConvertToKiloWattHour())}, + { E_AXL_LOSS, SumFunc((r, m) => m.WorkAxlegear().ConvertToKiloWattHour())}, + { E_ANGLE_LOSS, SumFunc((r, m) => m.WorkAngledrive().ConvertToKiloWattHour())}, + { E_BRAKE, SumFunc((r, m) => m.WorkTotalMechanicalBrake().ConvertToKiloWattHour())}, + { E_VEHICLE_INERTIA, SumFunc((r, m) => m.WorkVehicleInertia().ConvertToKiloWattHour())}, + { E_AIR, SumFunc((r, m) => m.WorkAirResistance().ConvertToKiloWattHour())}, + { E_ROLL, SumFunc((r, m) => m.WorkRollingResistance().ConvertToKiloWattHour())}, + { E_GRAD, SumFunc((r, m) => m.WorkRoadGradientResistance().ConvertToKiloWattHour())}, + { E_AUX_ESS_missing, SumFunc((r, m) => m.CorrectedModalData.WorkESSMissing.ConvertToKiloWattHour())}, + + + {E_WHEEL, SumFunc((r, m) => m.WorkWheels().ConvertToKiloWattHour())}, + + // BusAux + { AirGenerated, SumFunc((r, m) => (ConvertedSI)m.AirGenerated())}, + { AirConsumed, SumFunc((r, m) => (ConvertedSI)m.AirConsumed())}, + { E_PS_CompressorOff, SumFunc((r, m) => m.EnergyPneumaticCompressorPowerOff().ConvertToKiloWattHour())}, + { E_PS_CompressorOn, SumFunc((r, m) => m.EnergyPneumaticCompressorOn().ConvertToKiloWattHour())}, + { E_BusAux_ES_generated, SumFunc((r, m) => m.EnergyBusAuxESGenerated().ConvertToKiloWattHour())}, + { E_BusAux_ES_consumed, SumFunc((r, m) => m.EnergyBusAuxESConsumed().ConvertToKiloWattHour())}, + { Delta_E_BusAux_Battery, SumFunc((r, m) => (r.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorType == AlternatorType.Smart + ? m.DeltaSOCBusAuxBattery() * r.BusAuxiliaries.ElectricalUserInputsConfig.ElectricStorageCapacity + : 0.SI<WattSecond>()) + .ConvertToKiloWattHour()) }, + { E_BusAux_HVAC_Mech, SumFunc(new[] {ModalResultField.P_busAux_HVACmech_consumer}, (r, m) => m.TimeIntegral<WattSecond>(ModalResultField.P_busAux_HVACmech_consumer).ConvertToKiloWattHour())}, + { E_BusAux_HVAC_El, SumFunc(new[] {ModalResultField.P_busAux_ES_HVAC}, (r, m) => m.TimeIntegral<WattSecond>(ModalResultField.P_busAux_ES_HVAC).ConvertToKiloWattHour())}, + + // REESS + { E_REESS_LOSS, SumFunc((r, m) => m.REESSLoss().ConvertToKiloWattHour())}, + { E_REESS_T_chg, SumFunc((r, m) => m.WorkREESSChargeTerminal().ConvertToKiloWattHour())}, + { E_REESS_T_dischg, SumFunc((r, m) => m.WorkREESSDischargeTerminal().ConvertToKiloWattHour())}, + { E_REESS_int_chg, SumFunc((r, m) => m.WorkREESSChargeInternal().ConvertToKiloWattHour())}, + { E_REESS_int_dischg, SumFunc((r, m) => m.WorkREESSDischargeInternal().ConvertToKiloWattHour())}, + + { REESS_StartSoC, SumFunc((r, m) => r.BatteryData != null ? r.BatteryData.InitialSoC * 100 : r.SuperCapData.InitialSoC * 100)}, + { REESS_EndSoC, SumFunc((r, m) => m.REESSEndSoC())}, + { REESS_DeltaEnergy, SumFunc((r, m) => m.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName()).ConvertToKiloWattHour())}, + + // performance entries + { ACC, SumFunc((r, m) => (ConvertedSI)m.AccelerationAverage())}, + { ACC_POS, SumFunc((r, m) => (ConvertedSI)m.AccelerationsPositive())}, + { ACC_NEG, SumFunc((r, m) => (ConvertedSI)m.AccelerationsNegative())}, + { ACC_TIMESHARE, SumFunc((r, m) => (ConvertedSI)m.AccelerationTimeShare())}, + { DEC_TIMESHARE, SumFunc((r, m) => (ConvertedSI)m.DecelerationTimeShare())}, + { CRUISE_TIMESHARE, SumFunc((r, m) => (ConvertedSI)m.CruiseTimeShare())}, + { STOP_TIMESHARE, SumFunc((r, m) => (ConvertedSI)m.StopTimeShare())}, + { MAX_SPEED, SumFunc((r, m) => (ConvertedSI)m.MaxSpeed().AsKmph.SI<Scalar>())}, + { MAX_ACCELERATION, SumFunc((r, m) => (ConvertedSI)m.MaxAcceleration())}, + { MAX_DECELERATION, SumFunc((r, m) => (ConvertedSI)m.MaxDeceleration())}, + { AVG_ENGINE_SPEED, SumFunc((r, m) => (ConvertedSI)m.AvgEngineSpeed().AsRPM.SI<Scalar>())}, + { MAX_ENGINE_SPEED, SumFunc((r, m) => (ConvertedSI)m.MaxEngineSpeed().AsRPM.SI<Scalar>())}, + { AVERAGE_POS_ACC, SumFunc((r, m) => (ConvertedSI)m.AverageAccelerationBelowTargetSpeed())}, + + { AVERAGE_ENGINE_EFFICIENCY, SumFunc((r, m) => { + var eFC = 0.SI<Joule>(); + foreach (var fuel in m.FuelData) { + eFC += m.TimeIntegral<Kilogram>(m.GetColumnName(fuel, ModalResultField.FCFinal)) * fuel.LowerHeatingValueVecto; + } + var eIcePos = m.TimeIntegral<WattSecond>(ModalResultField.P_ice_fcmap, x => x > 0); + return eFC.IsEqual(0, 1e-9) ? 0 : (eIcePos / eFC).Value(); + }) }, + { AVERAGE_GEARBOX_EFFICIENCY, SumFunc(new[] { ModalResultField.P_gbx_in }, (r, m) => { + var gbxOutSignal = r.Retarder != null && r.Retarder.Type == RetarderType.TransmissionOutputRetarder + ? ModalResultField.P_retarder_in + : (r.AngledriveData == null ? ModalResultField.P_axle_in : ModalResultField.P_angle_in); + var eGbxIn = m.TimeIntegral<WattSecond>(ModalResultField.P_gbx_in, x => x > 0); + var eGbxOut = m.TimeIntegral<WattSecond>(gbxOutSignal, x => x > 0); + return eGbxIn.IsEqual(0, 1e-9) ? 0 : (eGbxOut / eGbxIn).Value(); + })}, + { AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP, SumFunc(new[] { ModalResultField.P_gbx_in, ModalResultField.P_TC_in }, (r, m) => { + var eTcIn = m.TimeIntegral<WattSecond>(ModalResultField.P_TC_in, x => x > 0); + var eTcOut = m.TimeIntegral<WattSecond>(ModalResultField.P_gbx_in, x => x > 0);; + return eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value(); + })}, + { AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP, SumFunc(new[] {ModalResultField.P_TC_in, ModalResultField.P_TC_out, ModalResultField.TC_Locked}, (r, m) => { + var tcData = m.GetValues( + x => new { + dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()), + locked = x.Field<int>(ModalResultField.TC_Locked.GetName()), + P_TCin = x.Field<Watt>(ModalResultField.P_TC_in.GetName()), + P_TCout = x.Field<Watt>(ModalResultField.P_TC_out.GetName()) + }); + var eTcIn = 0.SI<WattSecond>(); + var eTcOut = 0.SI<WattSecond>(); + foreach (var entry in tcData.Where(x => x.locked == 0)) { + eTcIn += entry.dt * entry.P_TCin; + eTcOut += entry.dt * entry.P_TCout; + } + + return eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value(); + } + )}, + { AVERAGE_ANGLEDRIVE_EFFICIENCY, SumFunc(new[] {ModalResultField.P_angle_in, ModalResultField.P_axle_in},(r, m) => { + if (r.AngledriveData == null) { + return null; + } + var eAngleIn = m.TimeIntegral<WattSecond>(ModalResultField.P_angle_in, x => x > 0); + var eAngleOut = m.TimeIntegral<WattSecond>(ModalResultField.P_axle_in, x => x > 0); + return (eAngleOut / eAngleIn).Value(); + }) + }, + { AVERAGE_AXLEGEAR_EFFICIENCY, SumFunc(new[] {ModalResultField.P_axle_in, ModalResultField.P_brake_in}, + (r, m) => { + if (r.AxleGearData == null) { + return null; + } + var eAxlIn = m.TimeIntegral<WattSecond>(ModalResultField.P_axle_in, x => x > 0); + var eAxlOut = m.TimeIntegral<WattSecond>(ModalResultField.P_brake_in, x => x > 0); + return eAxlIn.IsEqual(0, 1e-9) ? 0 : (eAxlOut / eAxlIn).Value(); + }) + }, + + { NUM_GEARSHIFTS, SumFunc((r, m) => ((uint?)r.GearboxData?.Gears.Count ?? 0u) == 1 ? 0.SI<Scalar>() : (ConvertedSI)m.GearshiftCount())}, + + { COASTING_TIME_SHARE, SumFunc((r, m) => (ConvertedSI)m.CoastingTimeShare()) }, + { BRAKING_TIME_SHARE, SumFunc((r, m) => (ConvertedSI)m.BrakingTimeShare()) }, + { ICE_FULL_LOAD_TIME_SHARE, SumFunc((r, m) => (ConvertedSI)m.ICEMaxLoadTimeShare()) }, + { ICE_OFF_TIME_SHARE, SumFunc((r, m) => (ConvertedSI)m.ICEOffTimeShare()) }, + { NUM_ICE_STARTS, SumFunc((r, m) => (ConvertedSI)m.NumICEStarts().SI<Scalar>()) }, + + // CO2 + { CO2_KM, SumFunc((r, m) => m.CorrectedModalData.KilogramCO2PerMeter.ConvertToGrammPerKiloMeter()) }, + { CO2_TKM, SumFunc((r, m) => r.VehicleData.Loading == null || r.VehicleData.Loading.IsEqual(0) ? null : (m.CorrectedModalData.KilogramCO2PerMeter / r.VehicleData.Loading).ConvertToGrammPerTonKilometer()) }, + { CO2_M3KM, SumFunc((r, m) => r.VehicleData.CargoVolume == null || r.VehicleData.CargoVolume.IsEqual(0) ? null : (m.CorrectedModalData.KilogramCO2PerMeter / r.VehicleData.CargoVolume).ConvertToGrammPerCubicMeterKiloMeter()) }, + { CO2_PKM, SumFunc((r, m) => r.VehicleData.PassengerCount == null ? null : (m.CorrectedModalData.KilogramCO2PerMeter / r.VehicleData.PassengerCount.Value).ConvertToGrammPerKiloMeter()) }, + + // electric consumption + { ElectricEnergyConsumptionPerKm, SumFunc(new[] {ModalResultField.P_reess_int}, (r, m) => (-m.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / m.Distance).Cast<JoulePerMeter>().ConvertToKiloWattHourPerKiloMeter())}, + + // {, SumFunc((r, m) =>)}, + }; + + + public static readonly Dictionary<string, Tuple<ModalResultField[], WriteFuelEntry>> FuelDataValue = new Dictionary<string, Tuple<ModalResultField[], WriteFuelEntry>>() { + { FCMAP_H, FuelFunc((r, m, f) => m.FuelConsumptionPerSecond(ModalResultField.FCMap, f)?.ConvertToGrammPerHour())}, + { FCMAP_KM, FuelFunc((r, m, f) => m.FuelConsumptionPerMeter(ModalResultField.FCMap, f)?.ConvertToGrammPerKiloMeter())}, + { FCNCVC_H, FuelFunc((r, m, f) => m.FuelConsumptionPerSecond(ModalResultField.FCNCVc, f)?.ConvertToGrammPerHour())}, + { FCNCVC_KM, FuelFunc((r, m, f) => m.FuelConsumptionPerMeter(ModalResultField.FCNCVc, f)?.ConvertToGrammPerKiloMeter())}, + { FCWHTCC_H, FuelFunc((r, m, f) => m.FuelConsumptionPerSecond(ModalResultField.FCWHTCc, f)?.ConvertToGrammPerHour())}, + { FCWHTCC_KM, FuelFunc((r, m, f) => m.FuelConsumptionPerMeter(ModalResultField.FCWHTCc, f)?.ConvertToGrammPerKiloMeter())}, + { K_ENGLINE, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).EngineLineCorrectionFactor.ConvertToGramPerKiloWattHour())}, + { K_VEHLINE, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).VehicleLine?.ConvertToGramPerKiloWattHour())}, + { FCESS_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_ESS_H?.ConvertToGrammPerHour())}, + { FCESS_H_CORR, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_ESS_CORR_H?.ConvertToGrammPerHour())}, + { FC_BusAux_PS_CORR_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_BusAux_PS_CORR_H?.ConvertToGrammPerHour())}, + { FC_BusAux_ES_CORR_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_BusAux_ES_CORR_H?.ConvertToGrammPerHour())}, + { FCWHR_H_CORR, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_WHR_CORR_H?.ConvertToGrammPerHour())}, + { FC_HEV_SOC_CORR_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_REESS_SOC_CORR_H?.ConvertToGrammPerHour())}, + { FC_HEV_SOC_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_REESS_SOC_H?.ConvertToGrammPerHour())}, + { FC_AUXHTR_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_AUXHTR_H?.ConvertToGrammPerHour())}, + { FC_AUXHTR_H_CORR, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_AUXHTR_H_CORR?.ConvertToGrammPerHour())}, + { FCFINAL_H, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_FINAL_H?.ConvertToGrammPerHour())}, + { FCWHR_KM_CORR, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_WHR_CORR_KM?.ConvertToGrammPerKiloMeter())}, + { FC_BusAux_PS_CORR_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_BusAux_PS_CORR_KM?.ConvertToGrammPerKiloMeter())}, + { FC_BusAux_ES_CORR_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_BusAux_ES_CORR_KM?.ConvertToGrammPerKiloMeter())}, + { FC_HEV_SOC_CORR_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_REESS_SOC_CORR_KM?.ConvertToGrammPerKiloMeter())}, + { FC_HEV_SOC_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_REESS_SOC_KM?.ConvertToGrammPerKiloMeter())}, + { FC_AUXHTR_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_AUXHTR_KM?.ConvertToGrammPerKiloMeter())}, + { FC_AUXHTR_KM_CORR, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_AUXHTR_KM_CORR?.ConvertToGrammPerKiloMeter())}, + { FCESS_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_ESS_KM?.ConvertToGrammPerKiloMeter())}, + { FCESS_KM_CORR, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_ESS_CORR_KM?.ConvertToGrammPerKiloMeter())}, + { FCFINAL_KM, FuelFunc((r, m, f) => m.CorrectedModalData.FuelConsumptionCorrection(f).FC_FINAL_KM?.ConvertToGrammPerKiloMeter())}, + + { FCFINAL_LITERPER100KM, FuelFunc((r, m, f) => f.FuelDensity == null ? null : m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter.ConvertToLiterPer100Kilometer()) }, + { FCFINAL_LITERPER100TKM, FuelFunc((r, m, f) => f.FuelDensity == null || r.VehicleData.Loading == null || r.VehicleData.Loading.IsEqual(0) || m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter == null ? null : (m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter / r.VehicleData.Loading).ConvertToLiterPer100TonKiloMeter()) }, + { FCFINAL_LiterPer100M3KM, FuelFunc((r, m, f) => f.FuelDensity == null || r.VehicleData.CargoVolume == null || r.VehicleData.CargoVolume.IsEqual(0) || m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter == null ? null : (m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter / r.VehicleData.CargoVolume).ConvertToLiterPerCubicMeter100KiloMeter()) }, + { FCFINAL_LiterPer100PassengerKM, FuelFunc((r, m, f) => f.FuelDensity == null || r.VehicleData.PassengerCount == null || m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter == null ? null :(m.CorrectedModalData.FuelConsumptionCorrection(f).FuelVolumePerMeter / r.VehicleData.PassengerCount.Value).ConvertToLiterPer100Kilometer()) }, + + { SPECIFIC_FC, FuelFunc((r, m, f) => r.Cycle.CycleType == CycleType.VTP ? (m.TotalFuelConsumption(ModalResultField.FCFinal, f) / m.WorkWheelsPos()).ConvertToGramPerKiloWattHour() : null) }, + + }; + + public static readonly Dictionary<string, WriteEmEntry> ElectricMotorValue = new Dictionary<string, WriteEmEntry>() { + { EM_AVG_SPEED_FORMAT, (r, m, em) => m.ElectricMotorAverageSpeed(em).ConvertToRoundsPerMinute() }, + { E_EM_Mot_DRIVE_FORMAT, (r, m, em) => m.TotalElectricMotorMotWorkDrive(em).ConvertToKiloWattHour() }, + { E_EM_Mot_GENERATE_FORMAT, (r, m, em) => m.TotalElectricMotorMotWorkRecuperate(em).ConvertToKiloWattHour() }, + { ETA_EM_Mot_DRIVE_FORMAT, (r, m, em) => new ConvertedSI(m.ElectricMotorMotEfficiencyDrive(em), "") }, + { ETA_EM_Mot_GEN_FORMAT, (r, m, em) => new ConvertedSI(m.ElectricMotorMotEfficiencyGenerate(em), "") }, + { E_EM_DRIVE_FORMAT, (r, m, em) => m.TotalElectricMotorWorkDrive(em).ConvertToKiloWattHour() }, + { E_EM_GENERATE_FORMAT, (r, m, em) => m.TotalElectricMotorWorkRecuperate(em).ConvertToKiloWattHour() }, + { ETA_EM_DRIVE_FORMAT, (r, m, em) => new ConvertedSI(m.ElectricMotorEfficiencyDrive(em), "") }, + { ETA_EM_GEN_FORMAT, (r, m, em) => new ConvertedSI(m.ElectricMotorEfficiencyGenerate(em), "") }, + { E_EM_OFF_Loss_Format, (r, m, em) => m.ElectricMotorOffLosses(em).ConvertToKiloWattHour() }, + { E_EM_LOSS_TRANSM_FORMAT, (r, m, em) => m.ElectricMotorTransmissionLosses(em).ConvertToKiloWattHour() }, + { E_EM_Mot_LOSS_FORMAT, (r, m, em) => m.ElectricMotorMotLosses(em).ConvertToKiloWattHour() }, + { E_EM_LOSS_FORMAT, (r, m, em) => m.ElectricMotorLosses(em).ConvertToKiloWattHour() }, + { E_EM_OFF_TIME_SHARE, (r, m, em) => (ConvertedSI)m.ElectricMotorOffTimeShare(em) }, + }; + + public static readonly Dictionary<string, WriteEmEntry> IEPCValue = new Dictionary<string, WriteEmEntry>() { + { IEPC_AVG_SPEED_FORMAT, (r, m, em) => m.ElectricMotorAverageSpeed(em).ConvertToRoundsPerMinute() }, + { E_IEPC_DRIVE_FORMAT, (r, m, em) => m.TotalElectricMotorWorkDrive(em).ConvertToKiloWattHour() }, + { E_IEPC_GENERATE_FORMAT, (r, m, em) => m.TotalElectricMotorWorkRecuperate(em).ConvertToKiloWattHour() }, + { ETA_IEPC_DRIVE_FORMAT, (r, m, em) => new ConvertedSI(m.ElectricMotorEfficiencyDrive(em), "") }, + { ETA_IEPC_GEN_FORMAT, (r, m, em) => new ConvertedSI(m.ElectricMotorEfficiencyGenerate(em), "") }, + { E_IEPC_OFF_Loss_Format, (r, m, em) => m.ElectricMotorOffLosses(em).ConvertToKiloWattHour() }, + { E_IEPC_LOSS_FORMAT, (r, m, em) => m.ElectricMotorLosses(em).ConvertToKiloWattHour() }, + { E_IEPC_OFF_TIME_SHARE, (r, m, em) => (ConvertedSI)m.ElectricMotorOffTimeShare(em) }, + }; + + public static readonly WriteAuxEntry AuxDataValue = (r, m, a) => m.AuxiliaryWork(a).ConvertToKiloWattHour(); } + } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 5a3196d1ca..575cb42558 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -41,8 +41,10 @@ using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader.Impl; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.DataBus; using TUGraz.VectoCore.Models.SimulationComponent; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.Utils; // ReSharper disable MemberCanBePrivate.Global -- used by API! @@ -54,7 +56,8 @@ namespace TUGraz.VectoCore.OutputData public interface ISumData { void Write(IModalDataContainer modData, VectoRunData runData); - void RegisterComponent(VectoSimulationComponent component); + void RegisterComponent(VectoSimulationComponent component, VectoRunData runData); + void AddAuxiliary(string id); } /// <summary> @@ -130,6 +133,7 @@ namespace TUGraz.VectoCore.OutputData Tuple.Create(SumDataFields.GEARBOX_MANUFACTURER, typeof(string)), Tuple.Create(SumDataFields.GEARBOX_MODEL, typeof(string)), Tuple.Create(SumDataFields.GEARBOX_TYPE, typeof(string)), + Tuple.Create(SumDataFields.AVERAGE_GEARBOX_EFFICIENCY, typeof(double)), Tuple.Create(SumDataFields.GEAR_RATIO_FIRST_GEAR, typeof(ConvertedSI)), Tuple.Create(SumDataFields.GEAR_RATIO_LAST_GEAR, typeof(ConvertedSI)), Tuple.Create(SumDataFields.TORQUECONVERTER_MANUFACTURER, typeof(string)), @@ -137,31 +141,126 @@ namespace TUGraz.VectoCore.OutputData Tuple.Create(SumDataFields.RETARDER_MANUFACTURER, typeof(string)), Tuple.Create(SumDataFields.RETARDER_MODEL, typeof(string)), Tuple.Create(SumDataFields.RETARDER_TYPE, typeof(string)), + Tuple.Create(SumDataFields.RETARDER_CERTIFICATION_METHOD, typeof(string)), + Tuple.Create(SumDataFields.RETARDER_CERTIFICATION_NUMBER, typeof(string)), Tuple.Create(SumDataFields.ANGLEDRIVE_MANUFACTURER, typeof(string)), Tuple.Create(SumDataFields.ANGLEDRIVE_MODEL, typeof(string)), Tuple.Create(SumDataFields.ANGLEDRIVE_RATIO, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ANGLEDRIVE_CERTIFICATION_METHOD, typeof(string)), + Tuple.Create(SumDataFields.ANGLEDRIVE_CERTIFICATION_NUMBER, typeof(string)), + Tuple.Create(SumDataFields.AVERAGE_ANGLEDRIVE_EFFICIENCY, typeof(double)), Tuple.Create(SumDataFields.AXLE_MANUFACTURER, typeof(string)), Tuple.Create(SumDataFields.AXLE_MODEL, typeof(string)), Tuple.Create(SumDataFields.AXLE_RATIO, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.AXLEGEAR_CERTIFICATION_METHOD, typeof(string)), + Tuple.Create(SumDataFields.AXLEGEAR_CERTIFICATION_NUMBER, typeof(string)), + Tuple.Create(SumDataFields.AVERAGE_AXLEGEAR_EFFICIENCY, typeof(double)), Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), typeof(string)), Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), typeof(string)), Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition), typeof(string)), Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), typeof(string)), Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), typeof(string)), + Tuple.Create(SumDataFields.E_AUX, typeof(ConvertedSI)), Tuple.Create(SumDataFields.TCU_MODEL, typeof(string)), Tuple.Create(SumDataFields.ADAS_TECHNOLOGY_COMBINATION, typeof(string)), Tuple.Create(SumDataFields.PTO_TECHNOLOGY, typeof(string)), Tuple.Create(SumDataFields.REESS_CAPACITY, typeof(string)), - Tuple.Create(SumDataFields.CARGO_VOLUME, typeof(ConvertedSI)) + Tuple.Create(SumDataFields.CARGO_VOLUME, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.COASTING_TIME_SHARE, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.BRAKING_TIME_SHARE, typeof(ConvertedSI)), }; public static Tuple<string, Type>[] CombustionEngineColumns = { - - + Tuple.Create(SumDataFields.ICE_FULL_LOAD_TIME_SHARE, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ICE_OFF_TIME_SHARE, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.NUM_ICE_STARTS, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.P_FCMAP, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.P_FCMAP_POS, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_FCMAP_POS, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_FCMAP_NEG, typeof(ConvertedSI)), }; public static Tuple<string, Type>[] VehilceColumns = { + Tuple.Create(SumDataFields.E_VEHICLE_INERTIA, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_AIR, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_ROLL, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_GRAD, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_POWERTRAIN_INERTIA, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] ClutchColumns = { + Tuple.Create(SumDataFields.E_CLUTCH_LOSS, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] GearboxColumns = { + Tuple.Create(SumDataFields.NUM_GEARSHIFTS, typeof(ConvertedSI)), + + }; + + public static Tuple<string, Type>[] IEPCTransmissionColumns = { }; + + public static Tuple<string, Type>[] TorqueConverterColumns = { + Tuple.Create(SumDataFields.E_TC_LOSS, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] AngledriveColumns = { + Tuple.Create(SumDataFields.E_ANGLE_LOSS, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] AxlegearColumns = { + Tuple.Create(SumDataFields.E_AXL_LOSS, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] RetarderColumns = { + Tuple.Create(SumDataFields.E_RET_LOSS, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] WheelColumns = { + Tuple.Create(SumDataFields.P_WHEEL, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.P_WHEEL_POS, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] BrakeColumns = { + Tuple.Create(SumDataFields.E_BRAKE, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] BatteryColumns = { + Tuple.Create(SumDataFields.REESS_StartSoC, typeof(double)), + Tuple.Create(SumDataFields.REESS_EndSoC, typeof(double)), + Tuple.Create(SumDataFields.REESS_DeltaEnergy, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_REESS_LOSS, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_REESS_T_chg, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_REESS_T_dischg, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_REESS_int_chg, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_REESS_int_dischg, typeof(ConvertedSI)), + }; + + public static Tuple<string, Type>[] ElectricMotorColumns = { + Tuple.Create(SumDataFields.EM_AVG_SPEED_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_Mot_DRIVE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_Mot_GENERATE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ETA_EM_Mot_DRIVE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ETA_EM_Mot_GEN_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_DRIVE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_GENERATE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ETA_EM_DRIVE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ETA_EM_GEN_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_OFF_Loss_Format, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_LOSS_TRANSM_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_Mot_LOSS_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_LOSS_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_EM_OFF_TIME_SHARE, typeof(ConvertedSI)), + }; + public static Tuple<string, Type>[] IEPCColumns = { + Tuple.Create(SumDataFields.IEPC_AVG_SPEED_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_IEPC_DRIVE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_IEPC_GENERATE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ETA_IEPC_DRIVE_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.ETA_IEPC_GEN_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_IEPC_OFF_Loss_Format, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_IEPC_LOSS_FORMAT, typeof(ConvertedSI)), + Tuple.Create(SumDataFields.E_IEPC_OFF_TIME_SHARE, typeof(ConvertedSI)), }; private object _tableLock = new object(); @@ -182,12 +281,102 @@ namespace TUGraz.VectoCore.OutputData CreateColumns(CommonColumns); } - public void RegisterComponent(VectoSimulationComponent component) + public void RegisterComponent(VectoSimulationComponent component, VectoRunData runData) { switch (component) { case ICombustionEngine _: CreateColumns(CombustionEngineColumns); break; + case EngineAuxiliary _: + break; + case IClutch _: + CreateColumns(ClutchColumns); + break; + case IGearbox _ when runData.JobType != VectoSimulationJobType.IEPC_E && runData.JobType != VectoSimulationJobType.IEPC_S: + CreateColumns(GearboxColumns); + CreateGearTimeShareColumns(runData.GearboxData.GearList); + break; + case IGearbox _ when runData.JobType == VectoSimulationJobType.IEPC_E: + case IGearbox _ when runData.JobType == VectoSimulationJobType.IEPC_S: + CreateColumns(IEPCTransmissionColumns); + break; + case ITorqueConverter _: + CreateColumns(TorqueConverterColumns); + break; + case IAngledrive _: + CreateColumns(AngledriveColumns); + break; + case IAxlegear _: + CreateColumns(AxlegearColumns); + break; + case Retarder _: + CreateColumns(RetarderColumns); + break; + case IWheels _: + CreateColumns(WheelColumns); + break; + case IBrakes _: + CreateColumns(BrakeColumns); + break; + case IDriver _: + //CreateColumns(DriverSignals); + break; + case IVehicle _: + CreateColumns(VehilceColumns); + break; + case IElectricMotor c3 when c3.Position == PowertrainPosition.IEPC: + CreateElectricMotorColumns(c3, runData, IEPCColumns); + break; + case IElectricMotor c4 when c4.Position != PowertrainPosition.IEPC: + CreateElectricMotorColumns(c4, runData, ElectricMotorColumns); + break; + case IElectricEnergyStorage c5 when c5 is BatterySystem: + CreateColumns(BatteryColumns); + break; + case IElectricEnergyStorage _: + CreateColumns(BatteryColumns); + break; + case IElectricSystem _: + //CreateColumns(ElectricSystemSignals); + break; + case IHybridController _: + //CreateColumns(HybridControllerSignals); + break; + case IDCDCConverter _: + //CreateColumns(DCDCConverterSignals); + break; + } + } + + public void AddAuxiliary(string id) + { + lock (Table) { + var colName = GetAuxColName(id); + if (Table.Columns.Contains(colName)) { + return; + } + Table.Columns.Add(colName, typeof(ConvertedSI)); + } + } + + private void CreateElectricMotorColumns(IElectricMotor em, VectoRunData runData, Tuple<string, Type>[] cols) + { + lock (Table) { + Table.Columns.AddRange(cols + .Select(x => Tuple.Create(string.Format(x.Item1, em.Position.GetName()), x.Item2)) + .Where(x => !Table.Columns.Contains(x.Item1)).Select(x => new DataColumn(x.Item1, x.Item2)) + .ToArray()); + } + } + + private void CreateGearTimeShareColumns(GearList gears) + { + lock (Table) { + Table.Columns.AddRange(gears + .Select(x => string.Format(SumDataFields.TIME_SHARE_PER_GEAR_FORMAT, x.Gear)) + .Concat(new [] {string.Format(SumDataFields.TIME_SHARE_PER_GEAR_FORMAT, 0)}).Distinct() + .Where(x => !Table.Columns.Contains(x)).Select(x => new DataColumn(x, typeof(ConvertedSI))) + .ToArray()); } } @@ -372,130 +561,130 @@ namespace TUGraz.VectoCore.OutputData private void InitTableColumns() { - lock (Table) { - Table.Columns.AddRange( - new[] { - Tuple.Create(SumDataFields.SORT, typeof(int)), - Tuple.Create(SumDataFields.JOB, typeof(string)), - Tuple.Create(SumDataFields.INPUTFILE, typeof(string)), - Tuple.Create(SumDataFields.CYCLE, typeof(string)), - Tuple.Create(SumDataFields.STATUS, typeof(string)), - Tuple.Create(SumDataFields.VEHICLE_MANUFACTURER, typeof(string)), - Tuple.Create(SumDataFields.VIN_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.VEHICLE_MODEL, typeof(string)), - Tuple.Create(SumDataFields.HDV_CO2_VEHICLE_CLASS, typeof(string)), - Tuple.Create(SumDataFields.CURB_MASS, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.LOADING, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.PassengerCount, typeof(double)), - Tuple.Create(SumDataFields.TOTAL_VEHICLE_MASS, typeof(ConvertedSI)), + //lock (Table) { + // Table.Columns.AddRange( + // new[] { + // Tuple.Create(SumDataFields.SORT, typeof(int)), + // Tuple.Create(SumDataFields.JOB, typeof(string)), + // Tuple.Create(SumDataFields.INPUTFILE, typeof(string)), + // Tuple.Create(SumDataFields.CYCLE, typeof(string)), + // Tuple.Create(SumDataFields.STATUS, typeof(string)), + // Tuple.Create(SumDataFields.VEHICLE_MANUFACTURER, typeof(string)), + // Tuple.Create(SumDataFields.VIN_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.VEHICLE_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.HDV_CO2_VEHICLE_CLASS, typeof(string)), + // Tuple.Create(SumDataFields.CURB_MASS, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.LOADING, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.PassengerCount, typeof(double)), + // Tuple.Create(SumDataFields.TOTAL_VEHICLE_MASS, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.AIRDRAG_MODEL, typeof(string)), - Tuple.Create(SumDataFields.CD_x_A_DECLARED, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.CD_x_A, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.SLEEPER_CAB, typeof(string)), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE1, typeof(double)), - Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE1, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE2, typeof(double)), - Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE2, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE3, typeof(double)), - Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE3, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE4, typeof(double)), - Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE4, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)), - Tuple.Create(SumDataFields.ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)), - Tuple.Create(SumDataFields.R_DYN, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.NUM_AXLES_DRIVEN, typeof(int)), - Tuple.Create(SumDataFields.NUM_AXLES_NON_DRIVEN, typeof(int)), - Tuple.Create(SumDataFields.NUM_AXLES_TRAILER, typeof(int)), - Tuple.Create(SumDataFields.GEARBOX_MANUFACTURER, typeof(string)), - Tuple.Create(SumDataFields.GEARBOX_MODEL, typeof(string)), - Tuple.Create(SumDataFields.GEARBOX_TYPE, typeof(string)), - Tuple.Create(SumDataFields.GEAR_RATIO_FIRST_GEAR, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.GEAR_RATIO_LAST_GEAR, typeof(ConvertedSI)), - Tuple.Create(SumDataFields.TORQUECONVERTER_MANUFACTURER, typeof(string)), - Tuple.Create(SumDataFields.TORQUECONVERTER_MODEL, typeof(string)), - Tuple.Create(SumDataFields.RETARDER_MANUFACTURER, typeof(string)), - Tuple.Create(SumDataFields.RETARDER_MODEL, typeof(string)), - Tuple.Create(SumDataFields.RETARDER_TYPE, typeof(string)), - Tuple.Create(SumDataFields.ANGLEDRIVE_MANUFACTURER, typeof(string)), - Tuple.Create(SumDataFields.ANGLEDRIVE_MODEL, typeof(string)), - Tuple.Create(SumDataFields.ANGLEDRIVE_RATIO, typeof(string)), - Tuple.Create(SumDataFields.AXLE_MANUFACTURER, typeof(string)), - Tuple.Create(SumDataFields.AXLE_MODEL, typeof(string)), - Tuple.Create(SumDataFields.AXLE_RATIO, typeof(ConvertedSI)), - Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), - typeof(string)), - Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), - typeof(string)), - Tuple.Create( - string.Format(SumDataFields.AUX_TECH_FORMAT, - Constants.Auxiliaries.IDs.HeatingVentilationAirCondition), - typeof(string)), - Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), - typeof(string)), - Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), - typeof(string)), - Tuple.Create(SumDataFields.TCU_MODEL, typeof(string)), - Tuple.Create(SumDataFields.ADAS_TECHNOLOGY_COMBINATION, typeof(string)), - Tuple.Create(SumDataFields.PTO_TECHNOLOGY, typeof(string)), - Tuple.Create(SumDataFields.REESS_CAPACITY, typeof(string)), - //Tuple.Create(PTO_OTHER_ELEMENTS, typeof(string)), - }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray()); - - Table.Columns.AddRange( - new[] { - SumDataFields.CARGO_VOLUME, SumDataFields.TIME, SumDataFields.DISTANCE, SumDataFields.SPEED, SumDataFields.ALTITUDE_DELTA, - }.Select(x => new DataColumn(x, typeof(ConvertedSI))).ToArray()); - - - Table.Columns.AddRange( - new[] { - SumDataFields.CO2_KM, SumDataFields.CO2_TKM, SumDataFields.CO2_M3KM, SumDataFields.CO2_PKM, SumDataFields.P_WHEEL, - SumDataFields.P_WHEEL_POS, SumDataFields.P_FCMAP, SumDataFields.P_FCMAP_POS, - SumDataFields.E_FCMAP_POS, SumDataFields.E_FCMAP_NEG, SumDataFields.E_POWERTRAIN_INERTIA, SumDataFields.E_AUX, - SumDataFields.E_AUX_EL_HV, SumDataFields.E_CLUTCH_LOSS, - SumDataFields.E_TC_LOSS, SumDataFields.E_SHIFT_LOSS, SumDataFields.E_GBX_LOSS, SumDataFields.E_RET_LOSS, - SumDataFields.E_ANGLE_LOSS, - SumDataFields.E_AXL_LOSS, SumDataFields.E_BRAKE, SumDataFields.E_VEHICLE_INERTIA, SumDataFields.E_WHEEL, SumDataFields.E_AIR, - SumDataFields.E_ROLL, SumDataFields.E_GRAD, - SumDataFields.AirConsumed, SumDataFields.AirGenerated, SumDataFields.E_PS_CompressorOff, SumDataFields.E_PS_CompressorOn, - SumDataFields.E_BusAux_ES_consumed, SumDataFields.E_BusAux_ES_generated, SumDataFields.Delta_E_BusAux_Battery, - SumDataFields.E_BusAux_PS_corr, SumDataFields.E_BusAux_ES_mech_corr, - SumDataFields.E_BusAux_HVAC_Mech, SumDataFields.E_BusAux_HVAC_El, - SumDataFields.E_BusAux_AuxHeater, - SumDataFields.E_WHR_EL, SumDataFields.E_WHR_MECH, SumDataFields.E_ICE_START, SumDataFields.E_AUX_ESS_missing, - SumDataFields.NUM_ICE_STARTS, SumDataFields.ACC, - SumDataFields.ACC_POS, SumDataFields.ACC_NEG, SumDataFields.ACC_TIMESHARE, SumDataFields.DEC_TIMESHARE, - SumDataFields.CRUISE_TIMESHARE, - SumDataFields.MAX_SPEED, SumDataFields.MAX_ACCELERATION, SumDataFields.MAX_DECELERATION, SumDataFields.AVG_ENGINE_SPEED, - SumDataFields.MAX_ENGINE_SPEED, SumDataFields.NUM_GEARSHIFTS, SumDataFields.STOP_TIMESHARE, - SumDataFields.ICE_FULL_LOAD_TIME_SHARE, SumDataFields.ICE_OFF_TIME_SHARE, - SumDataFields.COASTING_TIME_SHARE, SumDataFields.BRAKING_TIME_SHARE, SumDataFields.AVERAGE_POS_ACC - }.Select(x => new DataColumn(x, typeof(ConvertedSI))).ToArray()); - - Table.Columns.AddRange( - new[] { - Tuple.Create(SumDataFields.ENGINE_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.AVERAGE_ENGINE_EFFICIENCY, typeof(double)), - Tuple.Create(SumDataFields.TORQUE_CONVERTER_CERTIFICATION_METHOD, typeof(string)), - Tuple.Create(SumDataFields.TORQUE_CONVERTER_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP, typeof(double)), - Tuple.Create(SumDataFields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP, typeof(double)), - Tuple.Create(SumDataFields.GEARBOX_CERTIFICATION_METHOD, typeof(string)), - Tuple.Create(SumDataFields.GEARBOX_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.AVERAGE_GEARBOX_EFFICIENCY, typeof(double)), - Tuple.Create(SumDataFields.RETARDER_CERTIFICATION_METHOD, typeof(string)), - Tuple.Create(SumDataFields.RETARDER_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.ANGLEDRIVE_CERTIFICATION_METHOD, typeof(string)), - Tuple.Create(SumDataFields.ANGLEDRIVE_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.AVERAGE_ANGLEDRIVE_EFFICIENCY, typeof(double)), - Tuple.Create(SumDataFields.AXLEGEAR_CERTIFICATION_METHOD, typeof(string)), - Tuple.Create(SumDataFields.AXLEGEAR_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.AVERAGE_AXLEGEAR_EFFICIENCY, typeof(double)), - Tuple.Create(SumDataFields.AIRDRAG_CERTIFICATION_NUMBER, typeof(string)), - Tuple.Create(SumDataFields.AIRDRAG_CERTIFICATION_METHOD, typeof(string)), - }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray()); - } + // Tuple.Create(SumDataFields.AIRDRAG_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.CD_x_A_DECLARED, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.CD_x_A, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.SLEEPER_CAB, typeof(string)), + // Tuple.Create(SumDataFields.DECLARED_RRC_AXLE1, typeof(double)), + // Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE1, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.DECLARED_RRC_AXLE2, typeof(double)), + // Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE2, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.DECLARED_RRC_AXLE3, typeof(double)), + // Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE3, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.DECLARED_RRC_AXLE4, typeof(double)), + // Tuple.Create(SumDataFields.DECLARED_FZISO_AXLE4, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)), + // Tuple.Create(SumDataFields.ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)), + // Tuple.Create(SumDataFields.R_DYN, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.NUM_AXLES_DRIVEN, typeof(int)), + // Tuple.Create(SumDataFields.NUM_AXLES_NON_DRIVEN, typeof(int)), + // Tuple.Create(SumDataFields.NUM_AXLES_TRAILER, typeof(int)), + // Tuple.Create(SumDataFields.GEARBOX_MANUFACTURER, typeof(string)), + // Tuple.Create(SumDataFields.GEARBOX_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.GEARBOX_TYPE, typeof(string)), + // Tuple.Create(SumDataFields.GEAR_RATIO_FIRST_GEAR, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.GEAR_RATIO_LAST_GEAR, typeof(ConvertedSI)), + // Tuple.Create(SumDataFields.TORQUECONVERTER_MANUFACTURER, typeof(string)), + // Tuple.Create(SumDataFields.TORQUECONVERTER_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.RETARDER_MANUFACTURER, typeof(string)), + // Tuple.Create(SumDataFields.RETARDER_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.RETARDER_TYPE, typeof(string)), + // Tuple.Create(SumDataFields.ANGLEDRIVE_MANUFACTURER, typeof(string)), + // Tuple.Create(SumDataFields.ANGLEDRIVE_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.ANGLEDRIVE_RATIO, typeof(string)), + // Tuple.Create(SumDataFields.AXLE_MANUFACTURER, typeof(string)), + // Tuple.Create(SumDataFields.AXLE_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.AXLE_RATIO, typeof(ConvertedSI)), + // Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.SteeringPump), + // typeof(string)), + // Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.Fan), + // typeof(string)), + // Tuple.Create( + // string.Format(SumDataFields.AUX_TECH_FORMAT, + // Constants.Auxiliaries.IDs.HeatingVentilationAirCondition), + // typeof(string)), + // Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), + // typeof(string)), + // Tuple.Create(string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), + // typeof(string)), + // Tuple.Create(SumDataFields.TCU_MODEL, typeof(string)), + // Tuple.Create(SumDataFields.ADAS_TECHNOLOGY_COMBINATION, typeof(string)), + // Tuple.Create(SumDataFields.PTO_TECHNOLOGY, typeof(string)), + // Tuple.Create(SumDataFields.REESS_CAPACITY, typeof(string)), + // //Tuple.Create(PTO_OTHER_ELEMENTS, typeof(string)), + // }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray()); + + // Table.Columns.AddRange( + // new[] { + // SumDataFields.CARGO_VOLUME, SumDataFields.TIME, SumDataFields.DISTANCE, SumDataFields.SPEED, SumDataFields.ALTITUDE_DELTA, + // }.Select(x => new DataColumn(x, typeof(ConvertedSI))).ToArray()); + + + // Table.Columns.AddRange( + // new[] { + // SumDataFields.CO2_KM, SumDataFields.CO2_TKM, SumDataFields.CO2_M3KM, SumDataFields.CO2_PKM, SumDataFields.P_WHEEL, + // SumDataFields.P_WHEEL_POS, SumDataFields.P_FCMAP, SumDataFields.P_FCMAP_POS, + // SumDataFields.E_FCMAP_POS, SumDataFields.E_FCMAP_NEG, SumDataFields.E_POWERTRAIN_INERTIA, SumDataFields.E_AUX, + // SumDataFields.E_AUX_EL_HV, SumDataFields.E_CLUTCH_LOSS, + // SumDataFields.E_TC_LOSS, SumDataFields.E_SHIFT_LOSS, SumDataFields.E_GBX_LOSS, SumDataFields.E_RET_LOSS, + // SumDataFields.E_ANGLE_LOSS, + // SumDataFields.E_AXL_LOSS, SumDataFields.E_BRAKE, SumDataFields.E_VEHICLE_INERTIA, SumDataFields.E_WHEEL, SumDataFields.E_AIR, + // SumDataFields.E_ROLL, SumDataFields.E_GRAD, + // SumDataFields.AirConsumed, SumDataFields.AirGenerated, SumDataFields.E_PS_CompressorOff, SumDataFields.E_PS_CompressorOn, + // SumDataFields.E_BusAux_ES_consumed, SumDataFields.E_BusAux_ES_generated, SumDataFields.Delta_E_BusAux_Battery, + // SumDataFields.E_BusAux_PS_corr, SumDataFields.E_BusAux_ES_mech_corr, + // SumDataFields.E_BusAux_HVAC_Mech, SumDataFields.E_BusAux_HVAC_El, + // SumDataFields.E_BusAux_AuxHeater, + // SumDataFields.E_WHR_EL, SumDataFields.E_WHR_MECH, SumDataFields.E_ICE_START, SumDataFields.E_AUX_ESS_missing, + // SumDataFields.NUM_ICE_STARTS, SumDataFields.ACC, + // SumDataFields.ACC_POS, SumDataFields.ACC_NEG, SumDataFields.ACC_TIMESHARE, SumDataFields.DEC_TIMESHARE, + // SumDataFields.CRUISE_TIMESHARE, + // SumDataFields.MAX_SPEED, SumDataFields.MAX_ACCELERATION, SumDataFields.MAX_DECELERATION, SumDataFields.AVG_ENGINE_SPEED, + // SumDataFields.MAX_ENGINE_SPEED, SumDataFields.NUM_GEARSHIFTS, SumDataFields.STOP_TIMESHARE, + // SumDataFields.ICE_FULL_LOAD_TIME_SHARE, SumDataFields.ICE_OFF_TIME_SHARE, + // SumDataFields.COASTING_TIME_SHARE, SumDataFields.BRAKING_TIME_SHARE, SumDataFields.AVERAGE_POS_ACC + // }.Select(x => new DataColumn(x, typeof(ConvertedSI))).ToArray()); + + // Table.Columns.AddRange( + // new[] { + // Tuple.Create(SumDataFields.ENGINE_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.AVERAGE_ENGINE_EFFICIENCY, typeof(double)), + // Tuple.Create(SumDataFields.TORQUE_CONVERTER_CERTIFICATION_METHOD, typeof(string)), + // Tuple.Create(SumDataFields.TORQUE_CONVERTER_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP, typeof(double)), + // Tuple.Create(SumDataFields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP, typeof(double)), + // Tuple.Create(SumDataFields.GEARBOX_CERTIFICATION_METHOD, typeof(string)), + // Tuple.Create(SumDataFields.GEARBOX_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.AVERAGE_GEARBOX_EFFICIENCY, typeof(double)), + // Tuple.Create(SumDataFields.RETARDER_CERTIFICATION_METHOD, typeof(string)), + // Tuple.Create(SumDataFields.RETARDER_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.ANGLEDRIVE_CERTIFICATION_METHOD, typeof(string)), + // Tuple.Create(SumDataFields.ANGLEDRIVE_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.AVERAGE_ANGLEDRIVE_EFFICIENCY, typeof(double)), + // Tuple.Create(SumDataFields.AXLEGEAR_CERTIFICATION_METHOD, typeof(string)), + // Tuple.Create(SumDataFields.AXLEGEAR_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.AVERAGE_AXLEGEAR_EFFICIENCY, typeof(double)), + // Tuple.Create(SumDataFields.AIRDRAG_CERTIFICATION_NUMBER, typeof(string)), + // Tuple.Create(SumDataFields.AIRDRAG_CERTIFICATION_METHOD, typeof(string)), + // }.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray()); + //} } /// <summary> @@ -507,29 +696,7 @@ namespace TUGraz.VectoCore.OutputData lock (Table) { var outputColumns = GetOutputColumnsOrdered().ToArray(); var view = new DataView(Table, "", SumDataFields.SORT, DataViewRowState.CurrentRows).ToTable(false, outputColumns); - - //var probablyEmptyCols = new[] { SumDataFields.E_WHEEL, SumDataFields.SPECIFIC_FC }.Select(x => - // x.Contains("{") ? x.Substring(0, x.IndexOf("{", StringComparison.Ordinal)) : x).ToArray(); - //var removeCandidates = - // view.Columns.Cast<DataColumn>() - // .Where(column => probablyEmptyCols.Any(x => column.ColumnName.StartsWith(x))).ToList(); - //var toRemove = new List<string>(); - //foreach (var column in removeCandidates) { - // //var column = view.Columns[colName]; - // if (view.AsEnumerable().All(dr => dr.IsNull(column))) { - // toRemove.Add(column.ColumnName); - // } - //} - - //toRemove = toRemove.Concat( - // view.Columns.Cast<DataColumn>() - // .Where(column => column.ColumnName.StartsWith(SumDataFields.INTERNAL_PREFIX)) - // .Select(x => x.ColumnName)).ToList(); - - //foreach (var dataColumn in toRemove) { - // view.Columns.Remove(dataColumn); - //} - + try { _sumWriter.WriteSumData(view); } catch (Exception e) { @@ -563,20 +730,20 @@ namespace TUGraz.VectoCore.OutputData /// Writes the result of one run into the summary data container. /// </summary> //[MethodImpl(MethodImplOptions.Synchronized)] - protected DataRow GetResultRow(IModalDataContainer modData, VectoRunData runData) - { - lock (_tableLock) { - if (modData.HasCombustionEngine) { - UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); - } - } - - lock (Table) { - var row = Table.NewRow(); - //Table.Rows.Add(row); - return row; - } - } + //protected DataRow GetResultRow(IModalDataContainer modData, VectoRunData runData) + //{ + // lock (_tableLock) { + // if (modData.HasCombustionEngine) { + // UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); + // } + // } + + // lock (Table) { + // var row = Table.NewRow(); + // //Table.Rows.Add(row); + // return row; + // } + //} protected Dictionary<string, object> GetResultDictionary(IModalDataContainer modData, VectoRunData runData) { @@ -589,12 +756,12 @@ namespace TUGraz.VectoCore.OutputData return new Dictionary<string, object>(); } - protected void AddResultRow(DataRow row) - { - lock (_tableLock) { - Table.Rows.Add(row); - } - } + //protected void AddResultRow(DataRow row) + //{ + // lock (_tableLock) { + // Table.Rows.Add(row); + // } + //} private void AddResultDictionary(Dictionary<string, object> row) { @@ -619,13 +786,56 @@ namespace TUGraz.VectoCore.OutputData } if (func.Item1 == null || func.Item1.All(x => modData.ContainsColumn(x.GetName()))) { - row[col.ColumnName] = func.Item2(runData, modData); + var value = func.Item2(runData, modData); + if (value != null) { + row[col.ColumnName] = value; + } + } + } + + var multipleEngineModes = runData.EngineData.MultipleEngineFuelModes; + foreach (var fuel in modData.FuelData) { + var suffix = modData.FuelData.Count <= 1 && !multipleEngineModes ? "" : "_" + fuel.FuelType.GetLabel(); + foreach (var tuple in SumDataFields.FuelDataValue) { + if (tuple.Value.Item1 == null || tuple.Value.Item1.All(x => modData.ContainsColumn(x.GetName()))) { + var value = tuple.Value.Item2(runData, modData, fuel); + if (value != null) { + row[FcCol(tuple.Key, suffix)] = value; + } + } + } + } + + foreach (var em in runData.ElectricMachinesData) { + var fields = em.Item1 == PowertrainPosition.IEPC + ? SumDataFields.IEPCValue + : SumDataFields.ElectricMotorValue; + foreach (var entry in fields) { + var value = entry.Value(runData, modData, em.Item1); + row[string.Format(entry.Key, em.Item1.GetName())] = value; } } + foreach (var aux in modData.Auxiliaries) { + var colName = GetAuxColName(aux.Key); + row[colName] = SumDataFields.AuxDataValue(runData, modData, aux.Value); + } + + WriteGearshiftStats(modData, row, (uint?)runData.GearboxData?.Gears.Count ?? 0u); + + AddResultDictionary(row); } + private string GetAuxColName(string auxKey) + { + return string.Format( + auxKey.IsOneOf(new[] + { Constants.Auxiliaries.IDs.PTOConsumer, Constants.Auxiliaries.IDs.PTOTransmission }) + ? SumDataFields.E_FORMAT + : SumDataFields.E_AUX_FORMAT, auxKey); + } + //[MethodImpl(MethodImplOptions.Synchronized)] public virtual void WriteXXX(IModalDataContainer modData, VectoRunData runData) @@ -633,19 +843,19 @@ namespace TUGraz.VectoCore.OutputData //var row = GetResultRow(modData, runData); // Replace row with dictionary var row = GetResultDictionary(modData, runData); - row[SumDataFields.SORT] = runData.JobNumber * 1000 + runData.RunNumber; - row[SumDataFields.JOB] = $"{runData.JobNumber}-{runData.RunNumber}"; //ReplaceNotAllowedCharacters(current); - row[SumDataFields.INPUTFILE] = ReplaceNotAllowedCharacters(runData.JobName); - row[SumDataFields.CYCLE] = ReplaceNotAllowedCharacters(runData.Cycle.Name + Constants.FileExtensions.CycleFile); + //row[SumDataFields.SORT] = runData.JobNumber * 1000 + runData.RunNumber; + //row[SumDataFields.JOB] = $"{runData.JobNumber}-{runData.RunNumber}"; //ReplaceNotAllowedCharacters(current); + //row[SumDataFields.INPUTFILE] = ReplaceNotAllowedCharacters(runData.JobName); + //row[SumDataFields.CYCLE] = ReplaceNotAllowedCharacters(runData.Cycle.Name + Constants.FileExtensions.CycleFile); - row[SumDataFields.STATUS] = modData.RunStatus; + //row[SumDataFields.STATUS] = modData.RunStatus; var vehicleLoading = 0.SI<Kilogram>(); var cargoVolume = 0.SI<CubicMeter>(); var gearCount = 0u; double? passengerCount = null; if (runData.Cycle.CycleType != CycleType.EngineOnly) { - WriteFullPowertrain(runData, row); + //WriteFullPowertrain(runData, row); cargoVolume = runData.VehicleData.CargoVolume; vehicleLoading = runData.VehicleData.Loading; @@ -653,70 +863,70 @@ namespace TUGraz.VectoCore.OutputData passengerCount = runData.VehicleData.PassengerCount; } - row[SumDataFields.VEHICLE_FUEL_TYPE] = modData.FuelData.Select(x => x.GetLabel()).Join(); + //row[SumDataFields.VEHICLE_FUEL_TYPE] = modData.FuelData.Select(x => x.GetLabel()).Join(); var totalTime = modData.Duration; - row[SumDataFields.TIME] = (ConvertedSI)totalTime; + //row[SumDataFields.TIME] = (ConvertedSI)totalTime; var distance = modData.Distance; if (distance != null) { - row[SumDataFields.DISTANCE] = distance.ConvertToKiloMeter(); + //row[SumDataFields.DISTANCE] = distance.ConvertToKiloMeter(); } var speed = modData.Speed(); if (speed != null) { - row[SumDataFields.SPEED] = speed.ConvertToKiloMeterPerHour(); + //row[SumDataFields.SPEED] = speed.ConvertToKiloMeterPerHour(); } - row[SumDataFields.ALTITUDE_DELTA] = (ConvertedSI)modData.AltitudeDelta(); + //row[SumDataFields.ALTITUDE_DELTA] = (ConvertedSI)modData.AltitudeDelta(); if (modData.HasCombustionEngine) { - WriteFuelConsumptionEntries(modData, row, vehicleLoading, cargoVolume, passengerCount, runData); + //WriteFuelConsumptionEntries(modData, row, vehicleLoading, cargoVolume, passengerCount, runData); } else { if (runData.ElectricMachinesData.Count > 0) { - lock (Table) { - if (!Table.Columns.Contains(SumDataFields.ElectricEnergyConsumptionPerKm)) { - lock (_tableLock) { - var col = Table.Columns.Add(SumDataFields.ElectricEnergyConsumptionPerKm, typeof(ConvertedSI)); - col.SetOrdinal(Table.Columns[SumDataFields.CO2_KM].Ordinal); - } - } - } + //lock (Table) { + // if (!Table.Columns.Contains(SumDataFields.ElectricEnergyConsumptionPerKm)) { + // lock (_tableLock) { + // var col = Table.Columns.Add(SumDataFields.ElectricEnergyConsumptionPerKm, typeof(ConvertedSI)); + // col.SetOrdinal(Table.Columns[SumDataFields.CO2_KM].Ordinal); + // } + // } + //} - row[SumDataFields.ElectricEnergyConsumptionPerKm] = - (-modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / modData.Distance).Cast<JoulePerMeter>().ConvertToKiloWattHourPerKiloMeter(); + //row[SumDataFields.ElectricEnergyConsumptionPerKm] = + // (-modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int) / modData.Distance).Cast<JoulePerMeter>().ConvertToKiloWattHourPerKiloMeter(); } } if (runData.Mission?.MissionType == MissionType.VerificationTest) { - var fuelsWhtc = runData.EngineData.Fuels.Select( - fuel => modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel.FuelData, ModalResultField.FCWHTCc)) / - modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel.FuelData, ModalResultField.FCMap))) - .Select(dummy => (double)dummy).ToArray(); - row[SumDataFields.ENGINE_ACTUAL_CORRECTION_FACTOR] = fuelsWhtc.Join(" / "); + //var fuelsWhtc = runData.EngineData.Fuels.Select( + // fuel => modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel.FuelData, ModalResultField.FCWHTCc)) / + // modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel.FuelData, ModalResultField.FCMap))) + // .Select(dummy => (double)dummy).ToArray(); + // row[SumDataFields.ENGINE_ACTUAL_CORRECTION_FACTOR] = fuelsWhtc.Join(" / "); } - row[SumDataFields.P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt(); - row[SumDataFields.P_WHEEL] = modData.PowerWheel().ConvertToKiloWatt(); + //row[SumDataFields.P_WHEEL_POS] = modData.PowerWheelPositive().ConvertToKiloWatt(); + //row[SumDataFields.P_WHEEL] = modData.PowerWheel().ConvertToKiloWatt(); if (modData.HasCombustionEngine) { - row[SumDataFields.P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt(); - row[SumDataFields.P_FCMAP] = modData.TotalPowerEngineAverage().ConvertToKiloWatt(); + //row[SumDataFields.P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertToKiloWatt(); + //row[SumDataFields.P_FCMAP] = modData.TotalPowerEngineAverage().ConvertToKiloWatt(); } WriteAuxiliaries(modData, row, runData.BusAuxiliaries != null); - WriteWorkEntries(modData, row, runData); + //WriteWorkEntries(modData, row, runData); - WritePerformanceEntries(runData, modData, row); + //WritePerformanceEntries(runData, modData, row); - row[SumDataFields.COASTING_TIME_SHARE] = (ConvertedSI)modData.CoastingTimeShare(); - row[SumDataFields.BRAKING_TIME_SHARE] = (ConvertedSI)modData.BrakingTimeShare(); + //row[SumDataFields.COASTING_TIME_SHARE] = (ConvertedSI)modData.CoastingTimeShare(); + //row[SumDataFields.BRAKING_TIME_SHARE] = (ConvertedSI)modData.BrakingTimeShare(); if (runData.EngineData != null) { - row[SumDataFields.ICE_FULL_LOAD_TIME_SHARE] = (ConvertedSI)modData.ICEMaxLoadTimeShare(); - row[SumDataFields.ICE_OFF_TIME_SHARE] = (ConvertedSI)modData.ICEOffTimeShare(); - row[SumDataFields.NUM_ICE_STARTS] = (ConvertedSI)modData.NumICEStarts().SI<Scalar>(); + //row[SumDataFields.ICE_FULL_LOAD_TIME_SHARE] = (ConvertedSI)modData.ICEMaxLoadTimeShare(); + //row[SumDataFields.ICE_OFF_TIME_SHARE] = (ConvertedSI)modData.ICEOffTimeShare(); + //row[SumDataFields.NUM_ICE_STARTS] = (ConvertedSI)modData.NumICEStarts().SI<Scalar>(); } if (gearCount > 0) { @@ -728,121 +938,6 @@ namespace TUGraz.VectoCore.OutputData } - private void WriteFuelConsumptionEntries( - IModalDataContainer modData, Dictionary<string, object> row, Kilogram vehicleLoading, - CubicMeter cargoVolume, double? passengers, VectoRunData runData) - { - var multipleEngineModes = runData.EngineData.MultipleEngineFuelModes; - var vtpCycle = runData.Cycle.CycleType == CycleType.VTP; - - - row[SumDataFields.E_WHR_EL] = modData.CorrectedModalData.WorkWHREl.ConvertToKiloWattHour(); - row[SumDataFields.E_WHR_MECH] = modData.CorrectedModalData.WorkWHRMech.ConvertToKiloWattHour(); - - row[SumDataFields.E_BusAux_PS_corr] = modData.CorrectedModalData.WorkBusAuxPSCorr.ConvertToKiloWattHour(); - row[SumDataFields.E_BusAux_ES_mech_corr] = modData.CorrectedModalData.WorkBusAuxESMech.ConvertToKiloWattHour(); - - row[SumDataFields.E_BusAux_AuxHeater] = modData.CorrectedModalData.AuxHeaterDemand.Cast<WattSecond>().ConvertToKiloWattHour(); - - foreach (var fuel in modData.FuelData) { - var suffix = modData.FuelData.Count <= 1 && !multipleEngineModes ? "" : "_" + fuel.FuelType.GetLabel(); - - row[FcCol(SumDataFields.FCMAP_H, suffix)] = - modData.FuelConsumptionPerSecond(ModalResultField.FCMap, fuel)?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FCMAP_KM, suffix)] = - modData.FuelConsumptionPerMeter(ModalResultField.FCMap, fuel)?.ConvertToGrammPerKiloMeter(); - - - row[FcCol(SumDataFields.FCNCVC_H, suffix)] = - modData.FuelConsumptionPerSecond(ModalResultField.FCNCVc, fuel)?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FCNCVC_KM, suffix)] = - modData.FuelConsumptionPerMeter(ModalResultField.FCNCVc, fuel)?.ConvertToGrammPerKiloMeter(); - - row[FcCol(SumDataFields.FCWHTCC_H, suffix)] = - modData.FuelConsumptionPerSecond(ModalResultField.FCWHTCc, fuel)?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FCWHTCC_KM, suffix)] = - modData.FuelConsumptionPerMeter(ModalResultField.FCWHTCc, fuel)?.ConvertToGrammPerKiloMeter(); - - //modData.FuelConsumptionPerSecond(ModalResultField.FCICEStopStart, fuel) - // ?.ConvertToGrammPerHour(); - //modData.FuelConsumptionPerMeter(ModalResultField.FCICEStopStart, fuel) - // ?.ConvertToGrammPerKiloMeter(); - - var fuelConsumption = modData.CorrectedModalData.FuelConsumptionCorrection(fuel); - - row[FcCol(SumDataFields.K_ENGLINE, suffix)] = fuelConsumption.EngineLineCorrectionFactor.ConvertToGramPerKiloWattHour(); - row[FcCol(SumDataFields.K_VEHLINE, suffix)] = fuelConsumption.VehicleLine?.ConvertToGramPerKiloWattHour(); - - var vehLine = modData.VehicleLineSlope(fuel); - if (vehLine != null) { - row[FcCol(SumDataFields.K_VEHLINE, suffix)] = vehLine.ConvertToGramPerKiloWattHour(); - } - - row[FcCol(SumDataFields.FCESS_H, suffix)] = fuelConsumption.FC_ESS_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FCESS_H_CORR, suffix)] = fuelConsumption.FC_ESS_CORR_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FC_BusAux_PS_CORR_H, suffix)] = fuelConsumption.FC_BusAux_PS_CORR_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FC_BusAux_ES_CORR_H, suffix)] = fuelConsumption.FC_BusAux_ES_CORR_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FCWHR_H_CORR, suffix)] = fuelConsumption.FC_WHR_CORR_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FC_HEV_SOC_CORR_H, suffix)] = fuelConsumption.FC_REESS_SOC_CORR_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FC_HEV_SOC_H, suffix)] = fuelConsumption.FC_REESS_SOC_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FC_AUXHTR_H, suffix)] = fuelConsumption.FC_AUXHTR_H?.ConvertToGrammPerHour(); - row[FcCol(SumDataFields.FC_AUXHTR_H_CORR, suffix)] = fuelConsumption.FC_AUXHTR_H_CORR?.ConvertToGrammPerHour(); - - row[FcCol(SumDataFields.FCFINAL_H, suffix)] = fuelConsumption.FC_FINAL_H?.ConvertToGrammPerHour(); - - row[FcCol(SumDataFields.FCWHR_KM_CORR, suffix)] = fuelConsumption.FC_WHR_CORR_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FC_BusAux_PS_CORR_KM, suffix)] = fuelConsumption.FC_BusAux_PS_CORR_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FC_BusAux_ES_CORR_KM, suffix)] = fuelConsumption.FC_BusAux_ES_CORR_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FC_HEV_SOC_CORR_KM, suffix)] = fuelConsumption.FC_REESS_SOC_CORR_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FC_HEV_SOC_KM, suffix)] = fuelConsumption.FC_REESS_SOC_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FC_AUXHTR_KM, suffix)] = fuelConsumption.FC_AUXHTR_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FC_AUXHTR_KM_CORR, suffix)] = fuelConsumption.FC_AUXHTR_KM_CORR?.ConvertToGrammPerKiloMeter(); - - row[FcCol(SumDataFields.FCESS_KM, suffix)] = fuelConsumption.FC_ESS_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FCESS_KM_CORR, suffix)] = fuelConsumption.FC_ESS_CORR_KM?.ConvertToGrammPerKiloMeter(); - row[FcCol(SumDataFields.FCFINAL_KM, suffix)] = fuelConsumption.FC_FINAL_KM?.ConvertToGrammPerKiloMeter(); - - if (fuel.FuelDensity != null) { - - var fcVolumePerMeter = fuelConsumption.FuelVolumePerMeter; - row[FcCol(SumDataFields.FCFINAL_LITERPER100KM, suffix)] = fcVolumePerMeter?.ConvertToLiterPer100Kilometer(); - - if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcVolumePerMeter != null) { - row[FcCol(SumDataFields.FCFINAL_LITERPER100TKM, suffix)] = - (fcVolumePerMeter / vehicleLoading).ConvertToLiterPer100TonKiloMeter(); - } - if (cargoVolume > 0 && fcVolumePerMeter != null) { - row[FcCol(SumDataFields.FCFINAL_LiterPer100M3KM, suffix)] = - (fcVolumePerMeter / cargoVolume).ConvertToLiterPerCubicMeter100KiloMeter(); - } - - if (passengers != null && fcVolumePerMeter != null) { - // subtract driver! - row[FcCol(SumDataFields.FCFINAL_LiterPer100PassengerKM, suffix)] = - (fcVolumePerMeter / passengers.Value).ConvertToLiterPer100Kilometer(); - } - } - - if (vtpCycle) { - row[FcCol(SumDataFields.SPECIFIC_FC, suffix)] = (modData.TotalFuelConsumption(ModalResultField.FCFinal, fuel) / modData.WorkWheelsPos()) - .ConvertToGramPerKiloWattHour(); - } - } - - - - row[SumDataFields.CO2_KM] = modData.CorrectedModalData.KilogramCO2PerMeter.ConvertToGrammPerKiloMeter(); - if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) { - row[SumDataFields.CO2_TKM] = (modData.CorrectedModalData.KilogramCO2PerMeter / vehicleLoading).ConvertToGrammPerTonKilometer(); - } - if (cargoVolume > 0) { - row[SumDataFields.CO2_M3KM] = (modData.CorrectedModalData.KilogramCO2PerMeter / cargoVolume).ConvertToGrammPerCubicMeterKiloMeter(); - } - if (passengers != null) { - row[SumDataFields.CO2_PKM] = (modData.CorrectedModalData.KilogramCO2PerMeter / passengers.Value).ConvertToGrammPerKiloMeter(); - } - } - private static string FcCol(string col, string suffix) { return string.Format(col, suffix); @@ -872,547 +967,22 @@ namespace TUGraz.VectoCore.OutputData } if (writeBusAux) { - row[SumDataFields.E_BusAux_HVAC_Mech] = modData.TimeIntegral<WattSecond>(ModalResultField.P_busAux_HVACmech_consumer).ConvertToKiloWattHour(); - row[SumDataFields.E_BusAux_HVAC_El] = modData.TimeIntegral<WattSecond>(ModalResultField.P_busAux_ES_HVAC).ConvertToKiloWattHour(); + //row[SumDataFields.E_BusAux_HVAC_Mech] = modData.TimeIntegral<WattSecond>(ModalResultField.P_busAux_HVACmech_consumer).ConvertToKiloWattHour(); + //row[SumDataFields.E_BusAux_HVAC_El] = modData.TimeIntegral<WattSecond>(ModalResultField.P_busAux_ES_HVAC).ConvertToKiloWattHour(); } } private void WriteGearshiftStats(IModalDataContainer modData, Dictionary<string, object> row, uint gearCount) { - row[SumDataFields.NUM_GEARSHIFTS] = gearCount == 1 ? 0.SI<Scalar>() : (ConvertedSI)modData.GearshiftCount(); + //row[SumDataFields.NUM_GEARSHIFTS] = gearCount == 1 ? 0.SI<Scalar>() : (ConvertedSI)modData.GearshiftCount(); var timeSharePerGear = modData.TimeSharePerGear(gearCount); for (uint i = 0; i <= gearCount; i++) { var colName = string.Format(SumDataFields.TIME_SHARE_PER_GEAR_FORMAT, i); - lock (Table) - if (!Table.Columns.Contains(colName)) { - lock (_tableLock) { - Table.Columns.Add(colName, typeof(ConvertedSI)); - } - } row[colName] = (ConvertedSI)timeSharePerGear[i]; } } - private void WritePerformanceEntries(VectoRunData runData, IModalDataContainer modData, Dictionary<string, object> row) - { - row[SumDataFields.ACC] = (ConvertedSI)modData.AccelerationAverage(); - row[SumDataFields.ACC_POS] = (ConvertedSI)modData.AccelerationsPositive(); - row[SumDataFields.ACC_NEG] = (ConvertedSI)modData.AccelerationsNegative(); - var accTimeShare = modData.AccelerationTimeShare(); - row[SumDataFields.ACC_TIMESHARE] = (ConvertedSI)accTimeShare; - var decTimeShare = modData.DecelerationTimeShare(); - row[SumDataFields.DEC_TIMESHARE] = (ConvertedSI)decTimeShare; - var cruiseTimeShare = modData.CruiseTimeShare(); - row[SumDataFields.CRUISE_TIMESHARE] = (ConvertedSI)cruiseTimeShare; - var stopTimeShare = modData.StopTimeShare(); - row[SumDataFields.STOP_TIMESHARE] = (ConvertedSI)stopTimeShare; - - row[SumDataFields.MAX_SPEED] = (ConvertedSI)modData.MaxSpeed().AsKmph.SI<Scalar>(); - row[SumDataFields.MAX_ACCELERATION] = (ConvertedSI)modData.MaxAcceleration(); - row[SumDataFields.MAX_DECELERATION] = (ConvertedSI)modData.MaxDeceleration(); - if (runData.EngineData != null) { - row[SumDataFields.AVG_ENGINE_SPEED] = (ConvertedSI)modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); - row[SumDataFields.MAX_ENGINE_SPEED] = (ConvertedSI)modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); - } - - row[SumDataFields.AVERAGE_POS_ACC] = (ConvertedSI)modData.AverageAccelerationBelowTargetSpeed(); - if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) { - var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare; - if (!shareSum.IsEqual(100, 1e-2)) { - Log.Warn( - "Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%", - accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false), - cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false), - shareSum.ToOutputFormat(1, null, false)); - } - } - - var eFC = 0.SI<Joule>(); - foreach (var fuel in modData.FuelData) { - eFC += modData.TimeIntegral<Kilogram>(modData.GetColumnName(fuel, ModalResultField.FCFinal)) * fuel.LowerHeatingValueVecto; - } - var eIcePos = modData.TimeIntegral<WattSecond>(ModalResultField.P_ice_fcmap, x => x > 0); - row[SumDataFields.AVERAGE_ENGINE_EFFICIENCY] = eFC.IsEqual(0, 1e-9) ? 0 : (eIcePos / eFC).Value(); - - if (runData.SimulationType == SimulationType.EngineOnly) { - return; - } - - var gbxOutSignal = runData.Retarder != null && runData.Retarder.Type == RetarderType.TransmissionOutputRetarder - ? ModalResultField.P_retarder_in - : (runData.AngledriveData == null ? ModalResultField.P_axle_in : ModalResultField.P_angle_in); - var eGbxIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_gbx_in, x => x > 0); - var eGbxOut = modData.TimeIntegral<WattSecond>(gbxOutSignal, x => x > 0); - row[SumDataFields.AVERAGE_GEARBOX_EFFICIENCY] = eGbxIn.IsEqual(0, 1e-9) ? 0 : (eGbxOut / eGbxIn).Value(); - - if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN && runData.GearboxData.Type != GearboxType.IHPC) { - var eTcIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_TC_in, x => x > 0); - var eTcOut = eGbxIn; - row[SumDataFields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP] = eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value(); - - var tcData = modData.GetValues( - x => new { - dt = x.Field<Second>(ModalResultField.simulationInterval.GetName()), - locked = x.Field<int>(ModalResultField.TC_Locked.GetName()), - P_TCin = x.Field<Watt>(ModalResultField.P_TC_in.GetName()), - P_TCout = x.Field<Watt>(ModalResultField.P_TC_out.GetName()) - }); - eTcIn = 0.SI<WattSecond>(); - eTcOut = 0.SI<WattSecond>(); - foreach (var entry in tcData.Where(x => x.locked == 0)) { - eTcIn += entry.dt * entry.P_TCin; - eTcOut += entry.dt * entry.P_TCout; - } - - row[SumDataFields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP] = eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value(); - } - - if (runData.AngledriveData != null) { - var eAngleIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_angle_in, x => x > 0); - var eAngleOut = modData.TimeIntegral<WattSecond>(ModalResultField.P_axle_in, x => x > 0); - - row[SumDataFields.AVERAGE_ANGLEDRIVE_EFFICIENCY] = (eAngleOut / eAngleIn).Value(); - } - - var eAxlIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_axle_in, x => x > 0); - var eAxlOut = modData.TimeIntegral<WattSecond>(ModalResultField.P_brake_in, x => x > 0); - row[SumDataFields.AVERAGE_AXLEGEAR_EFFICIENCY] = eAxlIn.IsEqual(0, 1e-9) ? 0 : (eAxlOut / eAxlIn).Value(); - } - - private void WriteWorkEntries(IModalDataContainer modData, Dictionary<string, object> row, VectoRunData runData) - { - row[SumDataFields.E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertToKiloWattHour(); - row[SumDataFields.E_FCMAP_NEG] = (-modData.TotalEngineWorkNegative()).ConvertToKiloWattHour(); - row[SumDataFields.E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertToKiloWattHour(); - row[SumDataFields.E_AUX] = modData.WorkAuxiliaries().ConvertToKiloWattHour(); - row[SumDataFields.E_AUX_EL_HV] = modData.TimeIntegral<WattSecond>(ModalResultField.P_aux_el).ConvertToKiloWattHour(); - row[SumDataFields.E_CLUTCH_LOSS] = modData.WorkClutch().ConvertToKiloWattHour(); - row[SumDataFields.E_TC_LOSS] = modData.WorkTorqueConverter().ConvertToKiloWattHour(); - row[SumDataFields.E_SHIFT_LOSS] = modData.WorkGearshift().ConvertToKiloWattHour(); - row[SumDataFields.E_GBX_LOSS] = modData.WorkGearbox().ConvertToKiloWattHour(); - row[SumDataFields.E_RET_LOSS] = modData.WorkRetarder().ConvertToKiloWattHour(); - row[SumDataFields.E_AXL_LOSS] = modData.WorkAxlegear().ConvertToKiloWattHour(); - row[SumDataFields.E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertToKiloWattHour(); - row[SumDataFields.E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertToKiloWattHour(); - row[SumDataFields.E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertToKiloWattHour(); - row[SumDataFields.E_AIR] = modData.WorkAirResistance().ConvertToKiloWattHour(); - row[SumDataFields.E_ROLL] = modData.WorkRollingResistance().ConvertToKiloWattHour(); - row[SumDataFields.E_GRAD] = modData.WorkRoadGradientResistance().ConvertToKiloWattHour(); - row[SumDataFields.E_AUX_ESS_missing] = modData.CorrectedModalData.WorkESSMissing.ConvertToKiloWattHour(); - if (runData.Cycle.CycleType == CycleType.VTP) { - row[SumDataFields.E_WHEEL] = modData.WorkWheels().ConvertToKiloWattHour(); - } - - if (runData.BusAuxiliaries != null) { - row[SumDataFields.AirGenerated] = (ConvertedSI)modData.AirGenerated(); - row[SumDataFields.AirConsumed] = (ConvertedSI)modData.AirConsumed(); - row[SumDataFields.E_PS_CompressorOff] = modData.EnergyPneumaticCompressorPowerOff().ConvertToKiloWattHour(); - row[SumDataFields.E_PS_CompressorOn] = modData.EnergyPneumaticCompressorOn().ConvertToKiloWattHour(); - - row[SumDataFields.E_BusAux_ES_generated] = modData.EnergyBusAuxESGenerated().ConvertToKiloWattHour(); - row[SumDataFields.E_BusAux_ES_consumed] = modData.EnergyBusAuxESConsumed().ConvertToKiloWattHour(); - row[SumDataFields.Delta_E_BusAux_Battery] = (runData.BusAuxiliaries.ElectricalUserInputsConfig.AlternatorType == AlternatorType.Smart - ? modData.DeltaSOCBusAuxBattery() * runData.BusAuxiliaries.ElectricalUserInputsConfig.ElectricStorageCapacity - : 0.SI<WattSecond>()) - .ConvertToKiloWattHour(); - } - - row[SumDataFields.E_ICE_START] = modData.WorkEngineStart().ConvertToKiloWattHour(); - - foreach (var em in runData.ElectricMachinesData) { - var fields = em.Item1 == PowertrainPosition.IEPC - ? GetIEPCWorkEntries(modData, row, em) - : GetElectricMachineWorkEntries(modData, row, em); - fields.Reverse(); - foreach (var entry in fields) { - var colName = string.Format(entry.Item1, em.Item1.GetName()); - lock (Table) { - if (!Table.Columns.Contains(colName)) { - lock (_tableLock) { - var col = Table.Columns.Add(colName, typeof(ConvertedSI)); - col.SetOrdinal(Table.Columns[SumDataFields.E_GRAD].Ordinal + 1); - } - } - } - - row[colName] = entry.Item2; - } - } - - if (runData.BatteryData != null || runData.SuperCapData != null) { - foreach (var field in new[] { SumDataFields.REESS_StartSoC, SumDataFields.REESS_EndSoC }) { - lock (Table) { - if (Table.Columns.Contains(field)) { - continue; - } - - lock (_tableLock) { - var col = Table.Columns.Add(field, typeof(double)); - col.SetOrdinal(Table.Columns[SumDataFields.P_WHEEL].Ordinal); - } - } - } - - foreach (var field in new[] { - SumDataFields.REESS_DeltaEnergy, SumDataFields.E_REESS_LOSS, SumDataFields.E_REESS_T_chg, SumDataFields.E_REESS_T_dischg, - SumDataFields.E_REESS_int_chg, SumDataFields.E_REESS_int_dischg - }) { - lock (Table) { - if (Table.Columns.Contains(field)) { - continue; - } - - lock (_tableLock) { - var col = Table.Columns.Add(field, typeof(ConvertedSI)); - col.SetOrdinal(Table.Columns[SumDataFields.P_WHEEL].Ordinal); - } - } - } - row[SumDataFields.E_REESS_LOSS] = modData.REESSLoss().ConvertToKiloWattHour(); - row[SumDataFields.E_REESS_T_chg] = modData.WorkREESSChargeTerminal().ConvertToKiloWattHour(); - row[SumDataFields.E_REESS_T_dischg] = modData.WorkREESSDischargeTerminal().ConvertToKiloWattHour(); - row[SumDataFields.E_REESS_int_chg] = modData.WorkREESSChargeInternal().ConvertToKiloWattHour(); - row[SumDataFields.E_REESS_int_dischg] = modData.WorkREESSDischargeInternal().ConvertToKiloWattHour(); - } - - if (runData.BatteryData != null) { - row[SumDataFields.REESS_StartSoC] = runData.BatteryData.InitialSoC * 100; - row[SumDataFields.REESS_EndSoC] = modData.REESSEndSoC(); - row[SumDataFields.REESS_DeltaEnergy] = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName()) - .ConvertToKiloWattHour(); - - } - if (runData.SuperCapData != null) { - row[SumDataFields.REESS_StartSoC] = runData.SuperCapData.InitialSoC * 100; - row[SumDataFields.REESS_EndSoC] = modData.REESSEndSoC(); - row[SumDataFields.REESS_DeltaEnergy] = modData.TimeIntegral<WattSecond>(ModalResultField.P_reess_int.GetName()) - .ConvertToKiloWattHour(); - } - } - - private List<Tuple<string, ConvertedSI>> GetIEPCWorkEntries(IModalDataContainer modData, Dictionary<string, object> row, Tuple<PowertrainPosition, ElectricMotorData> em) - { - var emColumns = new List<Tuple<string, ConvertedSI>>() { - Tuple.Create(SumDataFields.IEPC_AVG_SPEED_FORMAT, - modData.ElectricMotorAverageSpeed(em.Item1).ConvertToRoundsPerMinute()), - - Tuple.Create(SumDataFields.E_IEPC_DRIVE_FORMAT, modData.TotalElectricMotorWorkDrive(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(SumDataFields.E_IEPC_GENERATE_FORMAT, - modData.TotalElectricMotorWorkRecuperate(em.Item1).ConvertToKiloWattHour()), - - Tuple.Create(SumDataFields.ETA_IEPC_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyDrive(em.Item1), "")), - Tuple.Create(SumDataFields.ETA_IEPC_GEN_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyGenerate(em.Item1), "")), - - Tuple.Create(SumDataFields.E_IEPC_OFF_Loss_Format, modData.ElectricMotorOffLosses(em.Item1).ConvertToKiloWattHour()), - - Tuple.Create(SumDataFields.E_IEPC_LOSS_FORMAT, modData.ElectricMotorLosses(em.Item1).ConvertToKiloWattHour()), - - Tuple.Create(SumDataFields.E_IEPC_OFF_TIME_SHARE, (ConvertedSI)modData.ElectricMotorOffTimeShare(em.Item1)) - }; - return emColumns; - } - - private List<Tuple<string, ConvertedSI>> GetElectricMachineWorkEntries(IModalDataContainer modData, Dictionary<string, object> row, Tuple<PowertrainPosition, ElectricMotorData> em) - { - var emColumns = new List<Tuple<string, ConvertedSI>>() { - Tuple.Create(SumDataFields.EM_AVG_SPEED_FORMAT, - modData.ElectricMotorAverageSpeed(em.Item1).ConvertToRoundsPerMinute()), - - Tuple.Create(SumDataFields.E_EM_Mot_DRIVE_FORMAT, - modData.TotalElectricMotorMotWorkDrive(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(SumDataFields.E_EM_Mot_GENERATE_FORMAT, - modData.TotalElectricMotorMotWorkRecuperate(em.Item1).ConvertToKiloWattHour()), - - Tuple.Create(SumDataFields.ETA_EM_Mot_DRIVE_FORMAT, - new ConvertedSI(modData.ElectricMotorMotEfficiencyDrive(em.Item1), "")), - Tuple.Create(SumDataFields.ETA_EM_Mot_GEN_FORMAT, - new ConvertedSI(modData.ElectricMotorMotEfficiencyGenerate(em.Item1), "")), - - - Tuple.Create(SumDataFields.E_EM_DRIVE_FORMAT, modData.TotalElectricMotorWorkDrive(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(SumDataFields.E_EM_GENERATE_FORMAT, - modData.TotalElectricMotorWorkRecuperate(em.Item1).ConvertToKiloWattHour()), - - Tuple.Create(SumDataFields.ETA_EM_DRIVE_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyDrive(em.Item1), "")), - Tuple.Create(SumDataFields.ETA_EM_GEN_FORMAT, new ConvertedSI(modData.ElectricMotorEfficiencyGenerate(em.Item1), "")), - - Tuple.Create(SumDataFields.E_EM_OFF_Loss_Format, modData.ElectricMotorOffLosses(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(SumDataFields.E_EM_LOSS_TRANSM_FORMAT, - modData.ElectricMotorTransmissionLosses(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(SumDataFields.E_EM_Mot_LOSS_FORMAT, modData.ElectricMotorMotLosses(em.Item1).ConvertToKiloWattHour()), - Tuple.Create(SumDataFields.E_EM_LOSS_FORMAT, modData.ElectricMotorLosses(em.Item1).ConvertToKiloWattHour()), - - Tuple.Create(SumDataFields.E_EM_OFF_TIME_SHARE, (ConvertedSI)modData.ElectricMotorOffTimeShare(em.Item1)) - }; - return emColumns; - - } - - private void WriteFullPowertrain(VectoRunData runData, Dictionary<string, object> row) - { - WriteVehicleData(runData, row); - - if (runData.BusAuxiliaries?.InputData != null) { - // only write in declaration mode - if input data is set - // subtract driver! - row[SumDataFields.PassengerCount] = runData.VehicleData.PassengerCount; - } - - row[SumDataFields.TCU_MODEL] = runData.ShiftStrategy; - row[SumDataFields.PTO_TECHNOLOGY] = runData.PTO?.TransmissionType ?? ""; - - WriteEngineData(runData.EngineData, row); - - WriteGearboxData(runData.GearboxData, row); - - WriteRetarderData(runData.Retarder, row); - - WriteAngledriveData(runData.AngledriveData, row); - - WriteAxlegearData(runData.AxleGearData, row); - - WriteAuxTechnologies(runData, row); - - WriteAxleWheelsData(runData.VehicleData.AxleData, row); - - WriteAirdragData(runData.AirdragData, row); - - } - - private static void WriteVehicleData(VectoRunData runData, Dictionary<string, object> row) - { - var data = runData.VehicleData; - //if (runData.VehicleData.b) - var gbxType = runData.GearboxData?.Type ?? GearboxType.NoGearbox; - - row[SumDataFields.VEHICLE_MANUFACTURER] = data.Manufacturer; - row[SumDataFields.VIN_NUMBER] = data.VIN; - row[SumDataFields.VEHICLE_MODEL] = data.ModelName; - - row[SumDataFields.HDV_CO2_VEHICLE_CLASS] = runData.Mission?.BusParameter?.BusGroup.GetClassNumber() ?? data.VehicleClass.GetClassNumber(); - row[SumDataFields.CURB_MASS] = (ConvertedSI)data.CurbMass; - - // - (data.BodyAndTrailerWeight ?? 0.SI<Kilogram>()); - row[SumDataFields.LOADING] = (ConvertedSI)data.Loading; - row[SumDataFields.CARGO_VOLUME] = (ConvertedSI)data.CargoVolume; - - row[SumDataFields.TOTAL_VEHICLE_MASS] = (ConvertedSI)data.TotalVehicleMass; - - row[SumDataFields.SLEEPER_CAB] = data.SleeperCab.HasValue ? (data.SleeperCab.Value ? "yes" : "no") : "-"; - - row[SumDataFields.ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] = - data.RollResistanceCoefficientWithoutTrailer; - row[SumDataFields.ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] = - data.TotalRollResistanceCoefficient; - - row[SumDataFields.R_DYN] = (ConvertedSI)data.DynamicTyreRadius; - - row[SumDataFields.ADAS_TECHNOLOGY_COMBINATION] = data.ADAS != null ? DeclarationData.ADASCombinations.Lookup(data.ADAS, gbxType).ID : ""; - - var cap = ""; - if (runData.BatteryData?.Capacity != null) { - cap = $"{runData.BatteryData.Capacity.AsAmpHour} Ah"; - } - - if (runData.SuperCapData?.Capacity != null) { - cap = $"{runData.SuperCapData.Capacity} F"; - } - - row[SumDataFields.REESS_CAPACITY] = cap; - } - - private static void WriteAirdragData(AirdragData data, Dictionary<string, object> row) - { - row[SumDataFields.AIRDRAG_MODEL] = data.ModelName; - row[SumDataFields.AIRDRAG_CERTIFICATION_METHOD] = data.CertificationMethod.GetName(); - row[SumDataFields.AIRDRAG_CERTIFICATION_NUMBER] = - data.CertificationMethod == CertificationMethod.StandardValues ? "" : data.CertificationNumber; - row[SumDataFields.CD_x_A_DECLARED] = (ConvertedSI)data.DeclaredAirdragArea; - row[SumDataFields.CD_x_A] = (ConvertedSI)data.CrossWindCorrectionCurve.AirDragArea; - } - - private static void WriteEngineData(CombustionEngineData data, Dictionary<string, object> row) - { - if (data == null) { - return; - } - row[SumDataFields.ENGINE_MANUFACTURER] = data.Manufacturer; - row[SumDataFields.ENGINE_MODEL] = data.ModelName; - row[SumDataFields.ENGINE_CERTIFICATION_NUMBER] = data.CertificationNumber; - row[SumDataFields.ENGINE_FUEL_TYPE] = data.Fuels.Select(x => x.FuelData.GetLabel()).Join(" / "); - row[SumDataFields.ENGINE_RATED_POWER] = data.RatedPowerDeclared != null && data.RatedPowerDeclared > 0 - ? data.RatedPowerDeclared.ConvertToKiloWatt() - : data.FullLoadCurves[0].MaxPower.ConvertToKiloWatt(); - row[SumDataFields.ENGINE_IDLING_SPEED] = (ConvertedSI)data.IdleSpeed.AsRPM.SI<Scalar>(); - row[SumDataFields.ENGINE_RATED_SPEED] = data.RatedSpeedDeclared != null && data.RatedSpeedDeclared > 0 - ? (ConvertedSI)data.RatedSpeedDeclared.AsRPM.SI<Scalar>() - : (ConvertedSI)data.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>(); - row[SumDataFields.ENGINE_DISPLACEMENT] = data.Displacement.ConvertToCubicCentiMeter(); - - row[SumDataFields.ENGINE_WHTC_URBAN] = data.Fuels.Select(x => x.WHTCUrban).Join(" / "); - row[SumDataFields.ENGINE_WHTC_RURAL] = data.Fuels.Select(x => x.WHTCRural).Join(" / "); - row[SumDataFields.ENGINE_WHTC_MOTORWAY] = data.Fuels.Select(x => x.WHTCMotorway).Join(" / "); - row[SumDataFields.ENGINE_BF_COLD_HOT] = data.Fuels.Select(x => x.ColdHotCorrectionFactor).Join(" / "); - row[SumDataFields.ENGINE_CF_REG_PER] = data.Fuels.Select(x => x.CorrectionFactorRegPer).Join(" / "); - row[SumDataFields.ENGINE_ACTUAL_CORRECTION_FACTOR] = data.Fuels.Select(x => x.FuelConsumptionCorrectionFactor).Join(" / "); - } - - private static void WriteAxleWheelsData(List<Axle> data, Dictionary<string, object> row) - { - var fields = new[] { - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE1, SumDataFields.DECLARED_FZISO_AXLE1), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE2, SumDataFields.DECLARED_FZISO_AXLE2), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE3, SumDataFields.DECLARED_FZISO_AXLE3), - Tuple.Create(SumDataFields.DECLARED_RRC_AXLE4, SumDataFields.DECLARED_FZISO_AXLE4), - }; - for (var i = 0; i < Math.Min(fields.Length, data.Count); i++) { - if (data[i].AxleType == AxleType.Trailer) { - continue; - } - - row[fields[i].Item1] = data[i].RollResistanceCoefficient; - row[fields[i].Item2] = (ConvertedSI)data[i].TyreTestLoad; - } - - row[SumDataFields.NUM_AXLES_DRIVEN] = data.Count(x => x.AxleType == AxleType.VehicleDriven); - row[SumDataFields.NUM_AXLES_NON_DRIVEN] = data.Count(x => x.AxleType == AxleType.VehicleNonDriven); - row[SumDataFields.NUM_AXLES_TRAILER] = data.Count(x => x.AxleType == AxleType.Trailer); - } - - private static void WriteAxlegearData(AxleGearData data, Dictionary<string, object> row) - { - if (data == null) { - return; - } - row[SumDataFields.AXLE_MANUFACTURER] = data.Manufacturer; - row[SumDataFields.AXLE_MODEL] = data.ModelName; - row[SumDataFields.AXLE_RATIO] = (ConvertedSI)data.AxleGear.Ratio.SI<Scalar>(); - row[SumDataFields.AXLEGEAR_CERTIFICATION_METHOD] = data.CertificationMethod.GetName(); - row[SumDataFields.AXLEGEAR_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues - ? "" - : data.CertificationNumber; - } - - private void WriteAuxTechnologies(VectoRunData runData, Dictionary<string, object> row) - { - var auxData = runData.Aux; - var busAux = runData.BusAuxiliaries; - foreach (var aux in auxData) { - if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) { - continue; - } - - var colName = string.Format(SumDataFields.AUX_TECH_FORMAT, aux.ID); - - lock (Table) - if (!Table.Columns.Contains(colName)) { - lock (_tableLock) { - var col = Table.Columns.Add(colName, typeof(string)); - - // move the new column to correct position - col.SetOrdinal(Table.Columns[SumDataFields.CARGO_VOLUME].Ordinal); - } - } - - row[colName] = aux.Technology == null ? "" : aux.Technology.Join("; "); - } - - if (busAux == null) { - return; - } - - row[string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.HeatingVentilationAirCondition)] = - busAux.SSMInputs is ISSMDeclarationInputs inputs ? inputs.HVACTechnology : "engineering mode"; - row[string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem)] = - busAux.ElectricalUserInputsConfig.AlternatorType.GetLabel(); - row[string.Format(SumDataFields.AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem)] = runData.JobType == VectoSimulationJobType.BatteryElectricVehicle ? "-" : - busAux.PneumaticUserInputsConfig.CompressorMap.Technology; - } - - private static void WriteAngledriveData(AngledriveData data, Dictionary<string, object> row) - { - if (data != null) { - row[SumDataFields.ANGLEDRIVE_MANUFACTURER] = data.Manufacturer; - row[SumDataFields.ANGLEDRIVE_MODEL] = data.ModelName; - row[SumDataFields.ANGLEDRIVE_RATIO] = data.Angledrive.Ratio; - row[SumDataFields.ANGLEDRIVE_CERTIFICATION_METHOD] = data.CertificationMethod.GetName(); - row[SumDataFields.ANGLEDRIVE_CERTIFICATION_NUMBER] = - data.CertificationMethod == CertificationMethod.StandardValues - ? "" - : data.CertificationNumber; - } else { - row[SumDataFields.ANGLEDRIVE_MANUFACTURER] = Constants.NOT_AVAILABLE; - row[SumDataFields.ANGLEDRIVE_MODEL] = Constants.NOT_AVAILABLE; - row[SumDataFields.ANGLEDRIVE_RATIO] = Constants.NOT_AVAILABLE; - row[SumDataFields.ANGLEDRIVE_CERTIFICATION_METHOD] = ""; - row[SumDataFields.ANGLEDRIVE_CERTIFICATION_NUMBER] = ""; - } - } - - private static void WriteRetarderData(RetarderData data, Dictionary<string, object> row) - { - row[SumDataFields.RETARDER_TYPE] = (data?.Type ?? RetarderType.None).GetLabel(); - if (data != null && data.Type.IsDedicatedComponent()) { - row[SumDataFields.RETARDER_MANUFACTURER] = data.Manufacturer; - row[SumDataFields.RETARDER_MODEL] = data.ModelName; - row[SumDataFields.RETARDER_CERTIFICATION_METHOD] = data.CertificationMethod.GetName(); - row[SumDataFields.RETARDER_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues - ? "" - : data.CertificationNumber; - } else { - row[SumDataFields.RETARDER_MANUFACTURER] = Constants.NOT_AVAILABLE; - row[SumDataFields.RETARDER_MODEL] = Constants.NOT_AVAILABLE; - row[SumDataFields.RETARDER_CERTIFICATION_METHOD] = ""; - row[SumDataFields.RETARDER_CERTIFICATION_NUMBER] = ""; - } - } - - private static void WriteGearboxData(GearboxData data, Dictionary<string, object> row) - { - if (data == null) { - return; - } - row[SumDataFields.GEARBOX_MANUFACTURER] = data.Manufacturer; - row[SumDataFields.GEARBOX_MODEL] = data.ModelName; - row[SumDataFields.GEARBOX_TYPE] = data.Type; - row[SumDataFields.GEARBOX_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues - ? "" - : data.CertificationNumber; - row[SumDataFields.GEARBOX_CERTIFICATION_METHOD] = data.CertificationMethod.GetName(); - if (data.Type.AutomaticTransmission()) { - row[SumDataFields.GEAR_RATIO_FIRST_GEAR] = data.Gears.Count > 0 - ? (double.IsNaN(data.Gears.First().Value.Ratio) - ? (ConvertedSI)data.Gears.First().Value.TorqueConverterRatio.SI<Scalar>() - : (ConvertedSI)data.Gears.First().Value.Ratio.SI<Scalar>()) - : 0.SI<Scalar>(); - row[SumDataFields.GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0 - ? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>() - : (ConvertedSI)0.SI<Scalar>(); - if (data.Type != GearboxType.APTN && data.Type != GearboxType.IHPC) { - row[SumDataFields.TORQUECONVERTER_MANUFACTURER] = data.TorqueConverterData.Manufacturer; - row[SumDataFields.TORQUECONVERTER_MODEL] = data.TorqueConverterData.ModelName; - row[SumDataFields.TORQUE_CONVERTER_CERTIFICATION_NUMBER] = - data.TorqueConverterData.CertificationMethod == CertificationMethod.StandardValues - ? "" - : data.TorqueConverterData.CertificationNumber; - row[SumDataFields.TORQUE_CONVERTER_CERTIFICATION_METHOD] = - data.TorqueConverterData.CertificationMethod.GetName(); - } - } else { - row[SumDataFields.GEAR_RATIO_FIRST_GEAR] = data.Gears.Count > 0 - ? (ConvertedSI)data.Gears.First().Value.Ratio.SI<Scalar>() - : (ConvertedSI)0.SI<Scalar>(); - row[SumDataFields.GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0 - ? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>() - : (ConvertedSI)0.SI<Scalar>(); - row[SumDataFields.TORQUECONVERTER_MANUFACTURER] = Constants.NOT_AVAILABLE; - row[SumDataFields.TORQUECONVERTER_MODEL] = Constants.NOT_AVAILABLE; - row[SumDataFields.TORQUE_CONVERTER_CERTIFICATION_METHOD] = ""; - row[SumDataFields.TORQUE_CONVERTER_CERTIFICATION_NUMBER] = ""; - } - } - public static string ReplaceNotAllowedCharacters(string text) { return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_'); diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs index 54b0580661..2ed1530d61 100644 --- a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs @@ -318,6 +318,8 @@ namespace TUGraz.VectoCore.Tests.Utils #endregion public IEnumerable<ISimulationPreprocessor> GetPreprocessingRuns { get { return new ISimulationPreprocessor[] { }; } } + public ISumData SumData { get; } + public void AddPreprocessor(ISimulationPreprocessor simulationPreprocessor) { throw new NotImplementedException(); -- GitLab