diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs index 17a667cdf95053bcb960416978ce8372742a5d41..81f2b58a6103a90171a5217edddd5873d7746536 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VectoRun.cs @@ -83,7 +83,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public virtual double Progress { - get { return CyclePort.Progress * (PostProcessingDone ? 1.0 : 0.99); } + get { return CyclePort.Progress * (PostProcessingDone ? 1.0 : 0.99) * (WritingResultsDone ? 1.0 : 0.99); } } protected VectoRun(IVehicleContainer container) @@ -93,6 +93,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl Container.RunStatus = Status.Pending; CyclePort = container.GetCycleOutPort(); PostProcessingDone = false; + WritingResultsDone = false; } public IVehicleContainer GetContainer() @@ -140,7 +141,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl if (!GetContainer().RunData.Exempted) { foreach (var fuel in GetContainer().RunData.EngineData.Fuels) { // calculate vehicleline correction here in local thread context because writing sum-data and report afterwards is synchronized - var cf = GetContainer().ModalData.VehicleLineCorrectionFactor(fuel.FuelData); + //var cf = GetContainer().ModalData.VehicleLineCorrectionFactor(fuel.FuelData); + GetContainer().ModalData.CalculateAggregateValues(); } } @@ -182,8 +184,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl Container.FinishSimulationRun(ex); throw ex; } - Container.RunStatus = Progress < 1 ? Status.Aborted : Status.Success; + Container.RunStatus = CyclePort.Progress < 1 ? Status.Aborted : Status.Success; Container.FinishSimulationRun(); + WritingResultsDone = true; if (Progress.IsSmaller(1, 1e-9)) { throw new VectoSimulationException( "{5} ({6} {7}) Progress: {8} - absTime: {0}, distance: {1}, dt: {2}, v: {3}, Gear: {4}", @@ -191,12 +194,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl RunSuffix, Progress); } IterationStatistics.FinishSimulation(RunName + CycleName + RunSuffix + RunIdentifier); - Log.Info("VectoJob finished."); } public bool PostProcessingDone { get; protected set; } + public bool WritingResultsDone { get; protected set; } + public void Cancel() { _cancelled = true; diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 616829475eadf28b90515cfb20dafd945b005e9b..0cbf32ebe1e1b9b6a6913784e88f0de8e0643c00 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -147,6 +147,15 @@ namespace TUGraz.VectoCore.OutputData [MethodImpl(MethodImplOptions.Synchronized)] + protected void WriteResults() + { + _resultCount--; + if (_resultCount == 0) { + DoWriteReport(); + Flc = null; + } + } + public void AddResult(LoadingType loadingType, Mission mission, int fuelMode, VectoRunData runData, IModalDataContainer modData) { @@ -159,16 +168,13 @@ namespace TUGraz.VectoCore.OutputData if (mission.MissionType != MissionType.ExemptedMission && !Missions[fuelMode][mission.MissionType].ResultEntry.ContainsKey(loadingType)) { throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType); } - _resultCount--; + if (mission.MissionType != MissionType.ExemptedMission) { DoAddResult(Missions[fuelMode][mission.MissionType].ResultEntry[loadingType], runData, modData); } - if (_resultCount == 0) { - DoWriteReport(); - Flc = null; - } + WriteResults(); } /// <summary> diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index b32044a47fd246829df28c2133df5b82f8607579..353d49e76fae77c6d470b2e68da0cf33a3392575 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -114,6 +114,7 @@ namespace TUGraz.VectoCore.OutputData Meter Distance { get; } KilogramPerWattSecond VehicleLineCorrectionFactor(FuelData.Entry fuel); + void CalculateAggregateValues(); } public static class ModalDataContainerExtensions diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index d37db93e4913ab98d648b9c55b6bd83609785fb4..8134139ebef9c454a0e8e8a8ea0035b5f2e707c1 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -183,6 +183,48 @@ namespace TUGraz.VectoCore.OutputData return _vehicleLine[fuel.FuelType]; } + public void CalculateAggregateValues() + { + var duration = Duration; + var distance = Distance; + if (distance != null && duration != null && !duration.IsEqual(0)) { + var speed = distance / duration; + } + + foreach (var fuel in FuelColumns.Keys) { + VehicleLineCorrectionFactor(fuel); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCMap)); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCNCVc)); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCWHTCc)); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCAAUX)); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCMap)); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCEngineStopStart)); + TimeIntegral<Kilogram>(GetColumnName(fuel, ModalResultField.FCFinal)); + + } + TimeIntegral<WattSecond>(ModalResultField.P_WHR_el_corr); + TimeIntegral<WattSecond>(ModalResultField.P_WHR_mech_corr); + TimeIntegral<WattSecond>(ModalResultField.P_aux_ice_off); + TimeIntegral<WattSecond>(ModalResultField.P_ice_start); + + TimeIntegral<WattSecond>(ModalResultField.P_clutch_loss); + TimeIntegral<WattSecond>(ModalResultField.P_gbx_shift_loss); + TimeIntegral<WattSecond>(ModalResultField.P_gbx_loss); + TimeIntegral<WattSecond>(ModalResultField.P_wheel_in); + TimeIntegral<WattSecond>(ModalResultField.P_axle_loss); + TimeIntegral<WattSecond>(ModalResultField.P_ret_loss); + TimeIntegral<WattSecond>(ModalResultField.P_angle_loss); + TimeIntegral<WattSecond>(ModalResultField.P_TC_loss); + TimeIntegral<WattSecond>(ModalResultField.P_brake_loss); + TimeIntegral<WattSecond>(ModalResultField.P_wheel_inertia); + TimeIntegral<WattSecond>(ModalResultField.P_veh_inertia); + TimeIntegral<WattSecond>(ModalResultField.P_aux); + TimeIntegral<WattSecond>(ModalResultField.P_slope); + TimeIntegral<WattSecond>(ModalResultField.P_roll); + TimeIntegral<WattSecond>(ModalResultField.P_air); + + } + public bool HasTorqueConverter { get; set; } public void CommitSimulationStep() diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 4e05fac1c9239d88f4d8b8cbd033af06eac166d2..361cd7e1886e5fcc75cf620182baa3e334557984 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -456,11 +456,17 @@ namespace TUGraz.VectoCore.OutputData /// Writes the result of one run into the summary data container. /// </summary> [MethodImpl(MethodImplOptions.Synchronized)] - public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData) + protected DataRow GetResultRow(IModalDataContainer modData, VectoRunData runData) { UpdateTableColumns(modData.FuelData, runData.EngineData.MultipleEngineFuelModes); var row = Table.NewRow(); Table.Rows.Add(row); + return row; + } + + public virtual void Write(IModalDataContainer modData, int jobNr, int runNr, VectoRunData runData) + { + var row = GetResultRow(modData, runData); row[SORT] = jobNr * 1000 + runNr; row[JOB] = string.Format("{0}-{1}", jobNr, runNr); //ReplaceNotAllowedCharacters(current); diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index 4d5664fc9694aeb00eb0354c2c665af5df0512b1..21f8ffdce531aa206253c86c34b3fa13d98ca2e9 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -238,6 +238,11 @@ namespace TUGraz.VectoCore.Tests.Utils return 0.SI<KilogramPerWattSecond>(); } + public void CalculateAggregateValues() + { + + } + public string RunName { get; set; } public string CycleName { get; set; } public string RunSuffix { get; set; }