diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb index 05470421bb3688a4ee7bdab9dd7ac2bdd51c8ac2..18f0d3e0291d14b3ea735c49323bf80e9913da54 100644 --- a/VECTO/Input Files/Gearbox.vb +++ b/VECTO/Input Files/Gearbox.vb @@ -55,55 +55,55 @@ Public Class Gearbox Public Type As GearboxType - 'Torque Converter Input - Public TorqueConverterReferenceRpm As Double - Private ReadOnly _torqueConverterFile As New SubPath - Public TorqueConverterInertia As Double - Public TorqueConverterShiftPolygonFile As String + 'Torque Converter Input + Public TorqueConverterReferenceRpm As Double + Private ReadOnly _torqueConverterFile As New SubPath + Public TorqueConverterInertia As Double + Public TorqueConverterShiftPolygonFile As String - Public UpshiftMinAcceleration As Double - Public DownshiftAfterUpshift As Double - Public UpshiftAfterDownshift As Double - Public TorqueConverterMaxSpeed As Double + Public UpshiftMinAcceleration As Double + Public DownshiftAfterUpshift As Double + Public UpshiftAfterDownshift As Double + Public TorqueConverterMaxSpeed As Double - Public PSInertiaFactor As Double + Public PSInertiaFactor As Double - Public PSShiftTime As Double + Public PSShiftTime As Double - Public Sub New() - _myPath = "" - _filePath = "" - SetDefault() - End Sub + Public Sub New() + _myPath = "" + _filePath = "" + SetDefault() + End Sub - Private Sub SetDefault() + Private Sub SetDefault() - ModelName = "" - GbxInertia = 0 - TracIntrSi = 0 + ModelName = "" + GbxInertia = 0 + TracIntrSi = 0 - GearRatios = New List(Of Double) - GearLossmaps = New List(Of SubPath) - GearshiftFiles = New List(Of SubPath) - MaxTorque = New List(Of String) + GearRatios = New List(Of Double) + GearLossmaps = New List(Of SubPath) + GearshiftFiles = New List(Of SubPath) + MaxTorque = New List(Of String) - TorqueResv = 0 - 'SkipGears = False - ShiftTime = 0 - TorqueResvStart = 0 - StartSpeed = 0 - StartAcc = 0 - 'ShiftInside = False + TorqueResv = 0 + 'SkipGears = False + ShiftTime = 0 + TorqueResvStart = 0 + StartSpeed = 0 + StartAcc = 0 + 'ShiftInside = False - Type = GearboxType.MT + Type = GearboxType.MT - TorqueConverterReferenceRpm = 0 - _torqueConverterFile.Clear() + TorqueConverterReferenceRpm = 0 + _torqueConverterFile.Clear() - TorqueConverterInertia = 0 - End Sub + TorqueConverterInertia = 0 + End Sub Public Function SaveFile() As Boolean @@ -432,66 +432,68 @@ Public Class Gearbox Get Return UpshiftAfterDownshift.SI (Of Second)() End Get - End Property - - Public ReadOnly Property PowershiftShiftTime As Second Implements IGearboxEngineeringInputData.PowershiftShiftTime - Get - Return PSShiftTime.SI(Of Second)() - End Get - End Property - Public ReadOnly Property PowerShiftInertiaFactor As Double Implements IGearboxEngineeringInputData.PowerShiftInertiaFactor - Get - Return PSInertiaFactor - End Get - End Property - - Public ReadOnly Property IGearboxEngineeringInputData_UpshiftMinAcceleration As MeterPerSquareSecond _ - Implements IGearboxEngineeringInputData.UpshiftMinAcceleration - Get - Return UpshiftMinAcceleration.SI(Of MeterPerSquareSecond)() - End Get - End Property - - - Public ReadOnly Property IGearboxEngineeringInputData_StartSpeed As MeterPerSecond _ - Implements IGearboxEngineeringInputData.StartSpeed - Get - Return StartSpeed.SI(Of MeterPerSecond)() - End Get - End Property - - Public ReadOnly Property MinTimeBetweenGearshift As Second _ - Implements IGearboxEngineeringInputData.MinTimeBetweenGearshift - Get - Return ShiftTime.SI(Of Second)() - End Get - End Property - - Public ReadOnly Property TCData As TableData Implements ITorqueConverterDeclarationInputData.TCData - Get - If Not File.Exists(_torqueConverterFile.FullPath) Then Return Nothing - Return VectoCSVFile.Read(_torqueConverterFile.FullPath) - End Get - End Property - - - Public ReadOnly Property Ratio As Double Implements IAxleGearInputData.Ratio - Get - Return GearRatios(0) - End Get - End Property - - Public ReadOnly Property LossMap As TableData Implements IAxleGearInputData.LossMap - Get - If Not File.Exists(GearLossmaps(0).FullPath) Then Return Nothing - Return VectoCSVFile.Read(GearLossmaps(0).FullPath) - End Get - End Property - - Public ReadOnly Property Efficiency As Double Implements IAxleGearInputData.Efficiency - Get - Return GearLossMap(0, True).ToDouble(0) - End Get - End Property + End Property + + Public ReadOnly Property PowershiftShiftTime As Second Implements IGearboxEngineeringInputData.PowershiftShiftTime + Get + Return PSShiftTime.SI (Of Second)() + End Get + End Property + + Public ReadOnly Property PowerShiftInertiaFactor As Double _ + Implements IGearboxEngineeringInputData.PowerShiftInertiaFactor + Get + Return PSInertiaFactor + End Get + End Property + + Public ReadOnly Property IGearboxEngineeringInputData_UpshiftMinAcceleration As MeterPerSquareSecond _ + Implements IGearboxEngineeringInputData.UpshiftMinAcceleration + Get + Return UpshiftMinAcceleration.SI (Of MeterPerSquareSecond)() + End Get + End Property + + + Public ReadOnly Property IGearboxEngineeringInputData_StartSpeed As MeterPerSecond _ + Implements IGearboxEngineeringInputData.StartSpeed + Get + Return StartSpeed.SI (Of MeterPerSecond)() + End Get + End Property + + Public ReadOnly Property MinTimeBetweenGearshift As Second _ + Implements IGearboxEngineeringInputData.MinTimeBetweenGearshift + Get + Return ShiftTime.SI (Of Second)() + End Get + End Property + + Public ReadOnly Property TCData As TableData Implements ITorqueConverterDeclarationInputData.TCData + Get + If Not File.Exists(_torqueConverterFile.FullPath) Then Return Nothing + Return VectoCSVFile.Read(_torqueConverterFile.FullPath) + End Get + End Property + + + Public ReadOnly Property Ratio As Double Implements IAxleGearInputData.Ratio + Get + Return GearRatios(0) + End Get + End Property + + Public ReadOnly Property LossMap As TableData Implements IAxleGearInputData.LossMap + Get + If Not File.Exists(GearLossmaps(0).FullPath) Then Return Nothing + Return VectoCSVFile.Read(GearLossmaps(0).FullPath) + End Get + End Property + + Public ReadOnly Property Efficiency As Double Implements IAxleGearInputData.Efficiency + Get + Return GearLossMap(0, True).ToDouble(0) + End Get + End Property End Class diff --git a/VECTO/Input Files/VectoJob.vb b/VECTO/Input Files/VectoJob.vb index cd5afa53abc5ba6f55d1af7eeb9551d0765063b4..69c8d1520097d1390d39db9985b7f0ca46aea8ef 100644 --- a/VECTO/Input Files/VectoJob.vb +++ b/VECTO/Input Files/VectoJob.vb @@ -253,7 +253,10 @@ Public Class VectoJob RessourceHelper.ReadStream( DeclarationData.DeclarationDataResourcePrefix + ".VACC." + _driverAccelerationFile.OriginalPath + VectoCore.Configuration.Constants.FileExtensions.DriverAccelerationCurve) - Return VectoCSVFile.ReadStream(cycleDataRes) + Return _ + VectoCSVFile.ReadStream(cycleDataRes, + source:=DeclarationData.DeclarationDataResourcePrefix + ".VACC." + _driverAccelerationFile.OriginalPath + + VectoCore.Configuration.Constants.FileExtensions.DriverAccelerationCurve) Catch ex As Exception Return Nothing End Try @@ -305,7 +308,7 @@ Public Class VectoJob ' ReSharper disable once UnusedMember.Global -- used by Validation Public Shared Function ValidateJob(vectoJob As VectoJob, validationContext As ValidationContext) As ValidationResult - Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), + Dim modeService As ExecutionModeServiceContainer = TryCast(validationContext.GetService(GetType(ExecutionMode)), ExecutionModeServiceContainer) Dim mode As ExecutionMode = If(modeService Is Nothing, ExecutionMode.Declaration, modeService.Mode) @@ -617,10 +620,10 @@ Public Class VectoJob cycleData = VectoCSVFile.Read(cycleFile.FullPath) Else Try - Dim cycleDataRes As Stream = - RessourceHelper.ReadStream( - DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + cycleFile.OriginalPath + ".vdri") - cycleData = VectoCSVFile.ReadStream(cycleDataRes) + Dim resourceName As String = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + + cycleFile.OriginalPath + TUGraz.VectoCore.Configuration.Constants.FileExtensions.CycleFile + Dim cycleDataRes As Stream = RessourceHelper.ReadStream(resourceName) + cycleData = VectoCSVFile.ReadStream(cycleDataRes, source:=resourceName) Catch ex As Exception Throw New VectoException("Driving Cycle could not be read: " + cycleFile.OriginalPath) End Try @@ -659,7 +662,7 @@ Public Class VectoJob Public ReadOnly Property Auxiliaries As IList(Of IAuxiliaryEngineeringInputData) _ Implements IAuxiliariesEngineeringInputData.Auxiliaries Get - Return AuxData().Cast (Of IAuxiliaryEngineeringInputData).ToList() + Return AuxData().Cast(Of IAuxiliaryEngineeringInputData).ToList() End Get End Property @@ -687,7 +690,7 @@ Public Class VectoJob Public ReadOnly Property IAuxiliariesDeclarationInputData_Auxiliaries As IList(Of IAuxiliaryDeclarationInputData) _ Implements IAuxiliariesDeclarationInputData.Auxiliaries Get - Return AuxData().Cast (Of IAuxiliaryDeclarationInputData).ToList() + Return AuxData().Cast(Of IAuxiliaryDeclarationInputData).ToList() End Get End Property @@ -698,7 +701,7 @@ Public Class VectoJob retVal.Add(New AuxiliaryDataInputData() With { .ID = "ConstantAux", .AuxiliaryType = AuxiliaryDemandType.Constant, - .ConstantPowerDemand = AuxPAdd.SI (Of Watt)() + .ConstantPowerDemand = AuxPAdd.SI(Of Watt)() }) End If For Each auxEntry As KeyValuePair(Of String, AuxEntry) In AuxPaths @@ -718,7 +721,7 @@ Public Class VectoJob stream.ReadLine() ' skip header "Efficiency auxiliary to supply [-]" theAuxData.EfficiencyToSupply = stream.ReadLine().IndulgentParse() theAuxData.DemandMap = VectoCSVFile.ReadStream(New MemoryStream(Encoding.UTF8.GetBytes(stream.ReadToEnd())), - source := auxEntry.Value.Path.FullPath) + source:=auxEntry.Value.Path.FullPath) Next Return retVal diff --git a/VectoCommon/VectoCommon/InputData/TableData.cs b/VectoCommon/VectoCommon/InputData/TableData.cs index dab06bf240029617e7ad756ff0f0fd94397aebcb..d39590a29b8ea78ad69dc816962f4a3796a8c9d9 100644 --- a/VectoCommon/VectoCommon/InputData/TableData.cs +++ b/VectoCommon/VectoCommon/InputData/TableData.cs @@ -35,9 +35,9 @@ namespace TUGraz.VectoCommon.InputData { public class TableData : DataTable { - public TableData(string fileName) + public TableData(string fileName, DataSourceType sourceType = DataSourceType.CSVFile) { - SourceType = DataSourceType.CSVFile; + SourceType = sourceType; Source = fileName; } diff --git a/VectoConsole/Program.cs b/VectoConsole/Program.cs index c43997ec13c342d25fb95df27432b90e51832ec9..1b13c111ea95ecb4a84e449e621e10cf677053d2 100644 --- a/VectoConsole/Program.cs +++ b/VectoConsole/Program.cs @@ -277,10 +277,10 @@ Examples: Environment.ExitCode = Environment.ExitCode != 0 ? Environment.ExitCode : 1; } -#if DEBUG +//#if DEBUG Console.WriteLine("done."); Console.ReadKey(); -#endif +//#endif return Environment.ExitCode; } diff --git a/VectoConsole/Properties/Version.cs b/VectoConsole/Properties/Version.cs index 461621495045f78e762413307cc730cf30f5e90a..07af2f56d19940c162c83c521439e5a74ed764f4 100644 --- a/VectoConsole/Properties/Version.cs +++ b/VectoConsole/Properties/Version.cs @@ -30,5 +30,5 @@ */ using System.Reflection; -[assembly: AssemblyVersion("3.1.0.683")] -[assembly: AssemblyFileVersion("3.1.0.683")] +[assembly: AssemblyVersion("3.1.0.718")] +[assembly: AssemblyFileVersion("3.1.0.718")] diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs index 58e71ebfde573b2db5f0f09dc38600ea042496f6..f711212925ed0badb00bf78eaea61f52ea88df17 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs @@ -343,10 +343,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON cycleData = VectoCSVFile.Read(cycleFile); } else { try { - var cycleDataRes = - RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + - cycle.Value<string>() + ".vdri"); - cycleData = VectoCSVFile.ReadStream(cycleDataRes); + var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + + cycle.Value<string>() + Constants.FileExtensions.CycleFile; + cycleData = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName); } catch { Log.Debug("Driving Cycle could not be read: " + cycleFile); throw new VectoException("Driving Cycle could not be read: " + cycleFile); @@ -483,11 +482,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON } catch (VectoException e) { Log.Warn("Could not find file for acceleration curve. Trying lookup in declaration data."); try { - var cycleDataRes = - RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." + - acceleration.Value<string>() + - Constants.FileExtensions.DriverAccelerationCurve); - return VectoCSVFile.ReadStream(cycleDataRes); + var resourceName = DeclarationData.DeclarationDataResourcePrefix + ".VACC." + + acceleration.Value<string>() + + Constants.FileExtensions.DriverAccelerationCurve; + return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceName), source: resourceName); } catch (Exception) { throw new VectoException("Failed to read Driver Acceleration Curve: " + e.Message, e); } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs index feaf5c113c3339164fccce36a56af61452e11686..09a63d5cbc9981403704f7d68597a8dea79c7278 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeVectoRunDataFactory.cs @@ -52,9 +52,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl protected IDeclarationInputDataProvider InputDataProvider; - protected DeclarationReport Report; + protected IDeclarationReport Report; - internal DeclarationModeVectoRunDataFactory(IDeclarationInputDataProvider dataProvider, DeclarationReport report) + internal DeclarationModeVectoRunDataFactory(IDeclarationInputDataProvider dataProvider, IDeclarationReport report) { InputDataProvider = dataProvider; Report = report; @@ -112,7 +112,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl AngledriveData = angledriveData, Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData(), mission.MissionType, segment.VehicleClass), - Cycle = cycle, + Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), Retarder = retarderData, DriverData = driverdata, ExecutionMode = ExecutionMode.Declaration, @@ -123,7 +123,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl }; simulationRunData.EngineData.WHTCCorrectionFactor = DeclarationData.WHTCCorrection.Lookup(mission.MissionType, engineData.WHTCRural, engineData.WHTCUrban, engineData.WHTCMotorway) * engineData.ColdHotCorrectionFactor; - simulationRunData.Cycle.Name = mission.MissionType.ToString(); + //simulationRunData.Cycle.Name = mission.MissionType.ToString(); simulationRunData.VehicleData.VehicleClass = segment.VehicleClass; yield return simulationRunData; } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DrivingCycleProxy.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DrivingCycleProxy.cs new file mode 100644 index 0000000000000000000000000000000000000000..b96bf885f8413ee8898aace4f2124525c5ec22cd --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DrivingCycleProxy.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.InputData.Reader.Impl +{ + public class DrivingCycleProxy : IDrivingCycleData + { + public DrivingCycleProxy(DrivingCycleData cycle, string name) + { + Name = name; + CycleType = cycle.CycleType; + Entries = cycle.Entries; + } + + public List<DrivingCycleData.DrivingCycleEntry> Entries { get; private set; } + + public string Name { get; private set; } + + public CycleType CycleType { get; private set; } + + public void Finish() + { + Entries = new List<DrivingCycleData.DrivingCycleEntry>() { + Entries.First(), + Entries.Last() + }; + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs index 2fdaf732bb9976c59219ad8bc9dbeb7252c4404d..7ffdd8c59a029e1c73004a092c498c308c1e904d 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineOnlyVectoRunDataFactory.cs @@ -53,7 +53,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var simulationRunData = new VectoRunData { JobName = InputDataProvider.JobInputData().JobName, EngineData = dao.CreateEngineData(InputDataProvider.EngineInputData, null), - Cycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), + Cycle = + new DrivingCycleProxy( + DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, CycleType.EngineOnly, cycle.Name, false), cycle.Name), ExecutionMode = ExecutionMode.Engineering }; yield return simulationRunData; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index 1a4ac156deb1a486926c030996564b09cf0a671c..821c566c140be8500abaec5d2843cc70118aad4b 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -44,8 +44,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { public class EngineeringModeVectoRunDataFactory : LoggingObject, IVectoRunDataFactory { - // todo mk-2016-10-11: field is never used. Delete? - protected DriverData Driver; + private static readonly Dictionary<string, DrivingCycleData> CyclesCache = new Dictionary<string, DrivingCycleData>(); protected readonly IEngineeringInputDataProvider InputDataProvider; @@ -74,20 +73,29 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var angledriveData = dao.CreateAngledriveData(InputDataProvider.AngledriveInputData, useEfficiencyFallback: true); var ptoTransmissionData = dao.CreatePTOTransmissionData(InputDataProvider.PTOTransmissionInputData); - return InputDataProvider.JobInputData().Cycles.Select(cycle => new VectoRunData { - JobName = InputDataProvider.JobInputData().JobName, - EngineData = engineData, - GearboxData = gearboxData, - AxleGearData = axlegearData, - AngledriveData = angledriveData, - VehicleData = dao.CreateVehicleData(vehicleInputData), - DriverData = driver, - Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()), - AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()), - Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData), - PTO = ptoTransmissionData, - Cycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired), - ExecutionMode = ExecutionMode.Engineering + return InputDataProvider.JobInputData().Cycles.Select(cycle => { + DrivingCycleData drivingCycle; + if (CyclesCache.ContainsKey(cycle.CycleData.Source)) { + drivingCycle = CyclesCache[cycle.CycleData.Source]; + } else { + drivingCycle = DrivingCycleDataReader.ReadFromDataTable(cycle.CycleData, cycle.Name, crossWindRequired); + CyclesCache.Add(cycle.CycleData.Source, drivingCycle); + } + return new VectoRunData { + JobName = InputDataProvider.JobInputData().JobName, + EngineData = engineData, + GearboxData = gearboxData, + AxleGearData = axlegearData, + AngledriveData = angledriveData, + VehicleData = dao.CreateVehicleData(vehicleInputData), + DriverData = driver, + Aux = dao.CreateAuxiliaryData(InputDataProvider.AuxiliaryInputData()), + AdvancedAux = dao.CreateAdvancedAuxData(InputDataProvider.AuxiliaryInputData()), + Retarder = dao.CreateRetarderData(InputDataProvider.RetarderInputData), + PTO = ptoTransmissionData, + Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), + ExecutionMode = ExecutionMode.Engineering + }; }); } } diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 7f07aa894ef18c1b05d5e6be31fd227e0e9994b8..fab524d0b2b11e63baebfe5c0e9c0f76adf71f4a 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -449,7 +449,7 @@ namespace TUGraz.VectoCore.Models.Declaration public static IEnumerable<TorqueConverterEntry> GetTorqueConverterDragCurve(double ratio) { var resourceId = DeclarationData.DeclarationDataResourcePrefix + ".TorqueConverter.csv"; - var data = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId)); + var data = VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId); var characteristicTorque = (from DataRow row in data.Rows select new TorqueConverterEntry() { diff --git a/VectoCore/VectoCore/Models/Declaration/LookupData.cs b/VectoCore/VectoCore/Models/Declaration/LookupData.cs index ef4c938336fff7a134d783c03a2c82e7f4d43422..5a1543ca639ed759a1e56de19919d65141aa0497 100644 --- a/VectoCore/VectoCore/Models/Declaration/LookupData.cs +++ b/VectoCore/VectoCore/Models/Declaration/LookupData.cs @@ -56,7 +56,7 @@ namespace TUGraz.VectoCore.Models.Declaration protected static DataTable ReadCsvResource(string resourceId) { - return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId)); + return VectoCSVFile.ReadStream(RessourceHelper.ReadStream(resourceId), source: resourceId); } protected static void NormalizeTable(DataTable table) diff --git a/VectoCore/VectoCore/Models/Declaration/Segments.cs b/VectoCore/VectoCore/Models/Declaration/Segments.cs index 88fa836a691137a38eddd2c344ac572b556bd337..8606f7a12cf3cb44d7d4135c02e1731f12864dc3 100644 --- a/VectoCore/VectoCore/Models/Declaration/Segments.cs +++ b/VectoCore/VectoCore/Models/Declaration/Segments.cs @@ -48,7 +48,7 @@ namespace TUGraz.VectoCore.Models.Declaration protected override string ResourceId { - get { return DeclarationData.DeclarationDataResourcePrefix +".SegmentTable.csv"; } + get { return DeclarationData.DeclarationDataResourcePrefix + ".SegmentTable.csv"; } } protected override string ErrorMessage @@ -105,7 +105,9 @@ namespace TUGraz.VectoCore.Models.Declaration VehicleCategory = vehicleCategory, AxleConfiguration = axleConfiguration, VehicleClass = VehicleClassHelper.Parse(row.Field<string>("hdvclass")), - AccelerationFile = RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." + row.Field<string>(".vaccfile")), + AccelerationFile = + RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".VACC." + + row.Field<string>(".vaccfile")), Missions = CreateMissions(ref grossVehicleMassRating, curbWeight, row), GrossVehicleMassRating = grossVehicleMassRating }; @@ -155,7 +157,9 @@ namespace TUGraz.VectoCore.Models.Declaration var mission = new Mission { MissionType = missionType, CrossWindCorrection = row.Field<string>("crosswindcorrection" + GetMissionSuffix(missionType)), - CycleFile = RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + ".vdri"), + CycleFile = + RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + + Constants.FileExtensions.CycleFile), AxleWeightDistribution = GetAxleWeightDistribution(row, missionType), CurbWeight = curbWeight, BodyCurbWeight = body.CurbWeight, diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index 13c9fb8d812011e89ee3ff9c268cbb8aedf015ec..30e82ec2cd589357bb53d4db7181f4d94c4b0cdb 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -62,17 +62,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public AngledriveData AngledriveData { get; internal set; } [Required, ValidateObject] - public DrivingCycleData Cycle { get; internal set; } + public IDrivingCycleData Cycle { get; internal set; } [ValidateObject] public IEnumerable<AuxData> Aux { get; internal set; } public AdvancedAuxData AdvancedAux { get; internal set; } - // todo mk 2016-08-30: property is never used. Delete? - [ValidateObject] - public string AccelerationLimitingFile { get; internal set; } - [ValidateObject] public RetarderData Retarder { get; internal set; } @@ -90,7 +86,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public string ModFileSuffix { get; set; } [ValidateObject] - public DeclarationReport Report { get; set; } + public IDeclarationReport Report { get; set; } [Required, ValidateObject] public LoadingType Loading { get; set; } @@ -141,8 +137,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data for (var angularVelocity = engineData.IdleSpeed; angularVelocity < engineData.FullLoadCurve.RatedSpeed; angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurve.RatedSpeed - engineData.IdleSpeed) / 10.0) { - if (!gear.Value.HasLockedGear) + if (!gear.Value.HasLockedGear) { continue; + } var velocity = angularVelocity / gear.Value.Ratio / angledriveRatio / axlegearRatio * dynamicTyreRadius; @@ -195,8 +192,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data } if (runData.Cycle != null && runData.Cycle.Entries.Any(e => e.PTOActive)) { - if (runData.PTO == null || runData.PTO.PTOCycle == null) + if (runData.PTO == null || runData.PTO.PTOCycle == null) { return new ValidationResult("PTOCycle is used in DrivingCycle, but is not defined in Vehicle-Data."); + } } return ValidationResult.Success; diff --git a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs index 7e6718f20c21b75659be6af6002af1bb7dae0202..2daff398d3236d13893b6cd391da4820d98549cd 100644 --- a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs @@ -71,6 +71,6 @@ namespace TUGraz.VectoCore.Models.Simulation /// <summary> /// Finishes the simulation. /// </summary> - void FinishSimulation(); + new void FinishSimulation(); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs index b6472931c07fc21d3d7d7447dcb643a574b4909e..998ae37ac35eb54fbbe18fcf24215026bba6a16a 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/SimulatorFactory.cs @@ -57,7 +57,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl private readonly bool _engineOnlyMode; public SimulatorFactory(ExecutionMode mode, IInputDataProvider dataProvider, IOutputDataWriter writer, - DeclarationReport declarationReport = null) + IDeclarationReport declarationReport = null) { Log.Info("########## VectoCore Version {0} ##########", Assembly.GetExecutingAssembly().GetName().Version); JobNumber = Interlocked.Increment(ref _jobNumberCounter); @@ -125,6 +125,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl foreach (var data in DataReader.NextRun()) { var d = data; + if (d.Report != null) { + d.Report.PrepareResult(d.Loading, d.Mission); + } Action<ModalDataContainer> addReportResult = writer => { if (d.Report != null) { d.Report.AddResult(d.Loading, d.Mission, writer); @@ -174,7 +177,5 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl yield return run; } } - - } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 52d9aee6dcbf948bc1bbf29a77e269140700c9cf..9f002eee046869203c60ae8d428f85d7428d3383 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -318,6 +318,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ModData.Finish(RunStatus); WriteSumData(ModData, VehicleMass, VehicleLoading); + + ModData.FinishSimulation(); + DrivingCycle.FinishSimulation(); } public VectoRun.Status RunStatus { get; set; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs index 6224c73025a1a90360f0d2196865b6f50800b44f..be235259e15e25899382ee675bd7ade159208603 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs @@ -58,8 +58,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data } } + public interface IDrivingCycleData + { + List<DrivingCycleData.DrivingCycleEntry> Entries { get; } + string Name { get; } + CycleType CycleType { get; } + void Finish(); + } + [CustomValidation(typeof(DrivingCycleData), "ValidateCycleData")] - public class DrivingCycleData : SimulationComponentData + public class DrivingCycleData : SimulationComponentData, IDrivingCycleData { internal DrivingCycleData() {} @@ -69,6 +77,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public CycleType CycleType { get; internal set; } + public void Finish() {} + // ReSharper disable once UnusedMember.Global -- used by Validation public static ValidationResult ValidateCycleData(DrivingCycleData cycleData, ValidationContext validationContext) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs b/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs index 412603402262683f035d0ab35d45b544751b1e38..5c5d33f124be1016bd3658cd861853252614d74f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/IDrivingCycleInfo.cs @@ -61,5 +61,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Meter lookaheadDistance); IReadOnlyList<DrivingCycleData.DrivingCycleEntry> LookAhead(Second time); + + void FinishSimulation(); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs index 58c429fe8d74007c983b6905a6e738c01149193b..9b04cfa5a974e19cac13a16e0ecea31c22266147 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DistanceBasedDrivingCycle.cs @@ -54,7 +54,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl IDrivingCycle, ISimulationOutPort, IDrivingCycleInPort, IDisposable { private const double LookaheadTimeSafetyMargin = 1.5; - private readonly DrivingCycleData _data; + private readonly IDrivingCycleData _data; internal readonly DrivingCycleEnumerator CycleIntervalIterator; private bool _intervalProlonged; internal IdleControllerSwitcher IdleController; @@ -69,7 +69,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl get { return CycleIntervalIterator.RightSample; } } - public DistanceBasedDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) : base(container) + public DistanceBasedDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle) : base(container) { _data = cycle; CycleIntervalIterator = new DrivingCycleEnumerator(_data); @@ -282,8 +282,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (!stopTime.IsEqual(0) && stopTime.IsEqual(PreviousState.WaitTime)) { // we needed to stop at the current interval in the cycle and have already waited enough time, move on.. - if (IdleController != null) + if (IdleController != null) { IdleController.ActivateIdle(); + } CycleIntervalIterator.MoveNext(); } @@ -303,8 +304,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } else { if (stopTime.IsEqual(PreviousState.WaitTime)) { // we needed to stop at the current interval in the cycle and have already waited enough time, move on.. - if (IdleController != null) + if (IdleController != null) { IdleController.ActivateIdle(); + } CycleIntervalIterator.MoveNext(); } } @@ -408,6 +410,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return LookAhead(LookaheadTimeSafetyMargin * DataBus.VehicleSpeed * time); } + public void FinishSimulation() + { + _data.Finish(); + } + public CycleData CycleData { get @@ -480,9 +487,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public sealed class DrivingCycleEnumerator : IEnumerator<DrivingCycleData.DrivingCycleEntry> { private int _currentCycleIndex; - private readonly DrivingCycleData _data; + private readonly IDrivingCycleData _data; - public DrivingCycleEnumerator(DrivingCycleData data) + public DrivingCycleEnumerator(IDrivingCycleData data) { _currentCycleIndex = 0; _data = data; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs index 329e953bb8020bc771916911b548cfdcf632ef77..8b3b5726a89af2c39fbfd202a47396967482b790 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MeasuredSpeedDrivingCycle.cs @@ -52,7 +52,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> public class MeasuredSpeedDrivingCycle : StatefulProviderComponent - <MeasuredSpeedDrivingCycle.DrivingCycleState, ISimulationOutPort, IDriverDemandInPort, IDriverDemandOutPort>, + <MeasuredSpeedDrivingCycle.DrivingCycleState, ISimulationOutPort, IDriverDemandInPort, IDriverDemandOutPort>, IDriverInfo, IDrivingCycleInfo, IMileageCounter, IDriverDemandInProvider, IDriverDemandInPort, ISimulationOutProvider, ISimulationOutPort { @@ -70,7 +70,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public MeterPerSquareSecond Acceleration; } - protected readonly DrivingCycleData Data; + protected readonly IDrivingCycleData Data; private bool _isInitializing; protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; } protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; } @@ -82,7 +82,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> /// <param name="container">The container.</param> /// <param name="cycle">The cycle.</param> - public MeasuredSpeedDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) + public MeasuredSpeedDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle) : base(container) { Data = cycle; @@ -207,7 +207,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl getYValue: result => ((ResponseDryRun)result).DeltaFullLoad, evaluateFunction: x => NextComponent.Request(absTime, dt, x, gradient, true), criterion: - y => ((ResponseDryRun)y).DeltaFullLoad.Value()); + y => ((ResponseDryRun)y).DeltaFullLoad.Value()); Log.Info( "Found operating point for driver acceleration. absTime: {0}, dt: {1}, acceleration: {2}, gradient: {3}", absTime, @@ -227,9 +227,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl debug.Add(response); CurrentState.SimulationDistance = acceleration / 2 * dt * dt + DataBus.VehicleSpeed * dt; - if (CurrentState.SimulationDistance.IsSmaller(0)) + if (CurrentState.SimulationDistance.IsSmaller(0)) { throw new VectoSimulationException( "MeasuredSpeed: Simulation Distance must not be negative. Driving Backward is not allowed."); + } CurrentState.Distance = CurrentState.SimulationDistance + PreviousState.Distance; CurrentState.Acceleration = acceleration; @@ -307,6 +308,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl throw new NotImplementedException(); } + public void FinishSimulation() + { + Data.Finish(); + } + public bool VehicleStopped { get { return !_isInitializing && LeftSample.Current.VehicleTargetSpeed.IsEqual(0); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs index d453f58cf5249d85875841bd700bdbc1b665a8e3..1e81e876ab0d76371bdb613e4f50082f2a9af930 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PWheelCycle.cs @@ -53,7 +53,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// <param name="cycle">The cycle.</param> /// <param name="axleRatio">The axle ratio.</param> /// <param name="gearRatios"></param> - public PWheelCycle(IVehicleContainer container, DrivingCycleData cycle, double axleRatio, + public PWheelCycle(IVehicleContainer container, IDrivingCycleData cycle, double axleRatio, IDictionary<uint, double> gearRatios) : base(container, cycle) { // just to ensure that null-gear has ratio 1 diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs index fb37c50311356d17fb09e8027ec407d248e5f64a..7b0cc4c5a2d7d96259c1f73c03070f4243703c6b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs @@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl StatefulProviderComponent<SimpleComponentState, ISimulationOutPort, ITnInPort, ITnOutPort>, IDrivingCycleInfo, ISimulationOutPort, ITnInProvider, ITnInPort { - protected readonly DrivingCycleData Data; + protected readonly IDrivingCycleData Data; protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; } protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; } @@ -62,7 +62,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> /// <param name="container">The container.</param> /// <param name="cycle">The cycle.</param> - public PowertrainDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) : base(container) + public PowertrainDrivingCycle(IVehicleContainer container, IDrivingCycleData cycle) : base(container) { Data = cycle; LeftSample = Data.Entries.GetEnumerator(); @@ -218,5 +218,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { throw new NotImplementedException(); } + + public void FinishSimulation() + { + Data.Finish(); + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/DeclarationReport.cs b/VectoCore/VectoCore/OutputData/DeclarationReport.cs index 3154a87b4201a298efd3b52dbeb34c8035a9e426..afe1d98050f1db20b6d2115b930ef8740e0ae4c0 100644 --- a/VectoCore/VectoCore/OutputData/DeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/DeclarationReport.cs @@ -32,38 +32,75 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.OutputData.PDF; namespace TUGraz.VectoCore.OutputData { + public interface IDeclarationReport + { + void PrepareResult(LoadingType loading, Mission mission); + void AddResult(LoadingType loadingType, Mission mission, IModalDataContainer modData); + void InitializeReport(VectoRunData modelData, Segment segment); + string Creator { get; set; } + string JobName { get; set; } + } + /// <summary> /// Class for creating a declaration report. /// </summary> - public abstract class DeclarationReport + public abstract class DeclarationReport<T> : IDeclarationReport where T : new() { - /// <summary> - /// Container class for one mission and the modData for the different loadings. - /// </summary> - protected class ResultContainer + ///// <summary> + ///// Container class for one mission and the modData for the different loadings. + ///// </summary> + //protected class ResultContainer<TResultEntry> + //{ + // /// <summary> + // /// The mission + // /// </summary> + // public Mission Mission; + + // /// <summary> + // /// Dictionary of LoadingTypes and DeclarationResults + // /// </summary> + // public Dictionary<LoadingType, TResultEntry> ModData; + //} + public class ResultContainer<TEntry> { - /// <summary> - /// The mission - /// </summary> + //public Stream PDFPage; public Mission Mission; - /// <summary> - /// Dictionary of LoadingTypes and their resulting Modal Data - /// </summary> - public Dictionary<LoadingType, IModalDataContainer> ModData; + public MissionProfile MissionProfile; + + public Dictionary<LoadingType, TEntry> ModData; + } + + public class MissionProfile + { + public readonly IList<double> DistanceKm; + public readonly IList<double> TargetSpeed; + public readonly IList<double> Altitude; + + public MissionProfile(IModalDataContainer m) + { + DistanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(); + TargetSpeed = + m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble(); + Altitude = m.GetValues<Meter>(ModalResultField.altitude).ToDouble(); + } } /// <summary> /// Dictionary of MissionTypes and their corresponding results. /// </summary> - protected readonly Dictionary<MissionType, ResultContainer> Missions = new Dictionary<MissionType, ResultContainer>(); + protected readonly Dictionary<MissionType, ResultContainer<T>> Missions = + new Dictionary<MissionType, ResultContainer<T>>(); /// <summary> /// The full load curve. @@ -78,7 +115,7 @@ namespace TUGraz.VectoCore.OutputData /// <summary> /// The creator name for the report. /// </summary> - public string Creator { get; internal set; } + public string Creator { get; set; } /// <summary> /// The name of the job file (report name will be the same) @@ -88,44 +125,66 @@ namespace TUGraz.VectoCore.OutputData /// <summary> /// The result count determines how many results must be given before the report gets written. /// </summary> - public int ResultCount { get; set; } + private int _resultCount; + + [MethodImpl(MethodImplOptions.Synchronized)] + public void PrepareResult(LoadingType loading, Mission mission) + { + if (!Missions.ContainsKey(mission.MissionType)) { + Missions[mission.MissionType] = new ResultContainer<T>() { + Mission = mission, + ModData = new Dictionary<LoadingType, T>() + }; + } + Missions[mission.MissionType].ModData[loading] = new T(); + } + - /// <summary> - /// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written. - /// </summary> - /// <param name="loadingType">Type of the loading.</param> - /// <param name="mission">The mission.</param> - /// <param name="modData">The mod data.</param> [MethodImpl(MethodImplOptions.Synchronized)] public void AddResult(LoadingType loadingType, Mission mission, IModalDataContainer modData) { if (modData.RunStatus != VectoRun.Status.Success) { - Missions.Clear(); + //Missions.Clear(); return; } - if (!Missions.ContainsKey(mission.MissionType)) { - Missions[mission.MissionType] = new ResultContainer { - Mission = mission, - ModData = new Dictionary<LoadingType, IModalDataContainer>() - }; + throw new VectoException("Unknown mission type {0} for generating declaration report", mission.MissionType); + } + if (!Missions[mission.MissionType].ModData.ContainsKey(loadingType)) { + throw new VectoException("Unknown loading type {0} for mission {1}", loadingType, mission.MissionType); } - Missions[mission.MissionType].ModData[loadingType] = modData; + if (Missions[mission.MissionType].MissionProfile == null) { + Missions[mission.MissionType].MissionProfile = new MissionProfile(modData); + } + _resultCount--; + + DoAddResult(Missions[mission.MissionType].ModData[loadingType], loadingType, mission, modData); - if (ResultCount == Missions.Sum(v => v.Value.ModData.Count)) { + if (_resultCount == 0) { DoWriteReport(); - Missions.Clear(); Flc = null; Segment = null; } } + /// <summary> + /// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written. + /// </summary> + /// <param name="entry"></param> + /// <param name="loadingType">Type of the loading.</param> + /// <param name="mission">The mission.</param> + /// <param name="modData">The mod data.</param> + [MethodImpl(MethodImplOptions.Synchronized)] + protected abstract void DoAddResult(T entry, LoadingType loadingType, Mission mission, IModalDataContainer modData); + + protected internal abstract void DoWriteReport(); + public void InitializeReport(VectoRunData modelData, Segment segment) { Segment = segment; - ResultCount = segment.Missions.Sum(m => m.Loadings.Count); + _resultCount = segment.Missions.Sum(m => m.Loadings.Count); DoInitializeReport(modelData, segment); } diff --git a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs index 33ccd8bad6f259b4e513368c527ace75905ece1c..007bc7946ad3456f513b3e844e86f9c0e6be954e 100644 --- a/VectoCore/VectoCore/OutputData/IModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/IModalDataContainer.cs @@ -111,6 +111,12 @@ namespace TUGraz.VectoCore.OutputData void SetDataValue(string fieldName, object value); void AddAuxiliary(string id, string columnName = null); + + /// <summary> + /// clear the modal data after the simulation + /// called after the simulation is finished and the sum-entries have been written + /// </summary> + void FinishSimulation(); } public static class ModalDataContainerExtensions @@ -209,8 +215,8 @@ namespace TUGraz.VectoCore.OutputData public static Scalar StopTimeShare(this IModalDataContainer data) { var stopTime = data.GetValues<MeterPerSecond>(ModalResultField.v_act) - .Zip(data.SimulationIntervals(), (v, dt) => new { v, dt }) - .Where(x => x.v < 0.1).Sum(x => x.dt) ?? 0.SI<Second>(); + .Zip(data.SimulationIntervals(), (v, dt) => new { v, dt }) + .Where(x => x.v < 0.1).Sum(x => x.dt) ?? 0.SI<Second>(); return 100 * (stopTime / data.Duration()).Cast<Scalar>(); } @@ -482,8 +488,9 @@ namespace TUGraz.VectoCore.OutputData var auxValues = data.GetValues<Watt>(auxCol).ToArray(); var sum = 0.SI<WattSecond>(); for (var i = 0; i < simulationIntervals.Length; i++) { - if (auxValues[i] != null && simulationIntervals[i] != null) + if (auxValues[i] != null && simulationIntervals[i] != null) { sum += auxValues[i] * simulationIntervals[i]; + } } return sum; } diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index dabdc513962729c1d36db1a4ca737b7f77bc0ac3..169c6a6d69083f0bd01209bff93ceb35d53102d1 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -46,7 +46,7 @@ namespace TUGraz.VectoCore.OutputData private readonly bool _writeEngineOnly; private readonly IModalDataFilter[] _filters; private readonly Action<ModalDataContainer> _addReportResult; - internal ModalResults Data { get; set; } + protected internal ModalResults Data { get; set; } private DataRow CurrentRow { get; set; } private readonly IModalDataWriter _writer; @@ -302,5 +302,13 @@ namespace TUGraz.VectoCore.OutputData Auxiliaries[id] = col; } } + + public void FinishSimulation() + { + Data.Clear(); //.Rows.Clear(); + Data = null; + CurrentRow = null; + Auxiliaries.Clear(); + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs index fde7538824f468e37dedbc76ee31be1fbf454b0d..7ec70b93e499ff48df8fd12b3c0462a333c634b2 100644 --- a/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs +++ b/VectoCore/VectoCore/OutputData/PDF/PDFDeclarationReport.cs @@ -36,10 +36,11 @@ using System.Drawing.Imaging; using System.Globalization; using System.IO; using System.Linq; -using System.Threading.Tasks; +using System.Runtime.CompilerServices; using System.Windows.Forms.DataVisualization.Charting; using iTextSharp.text; using iTextSharp.text.pdf; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Declaration; @@ -55,8 +56,41 @@ namespace TUGraz.VectoCore.OutputData.PDF /// <summary> /// Class for writing a PDF Declaration report. /// </summary> - public class PDFDeclarationReport : DeclarationReport + public class PDFDeclarationReport : DeclarationReport<PDFDeclarationReport.ResultEntry> { + public class ResultEntry + { + public IList<double> DistanceKm; + public IList<double> Speed; + + public IList<double> EngineSpeedAvg; + public IList<double> EngineTorqueAvg; + + public MeterPerSecond AverageSpeed; + public SI FcLiterPer100Km; + + public SI Co2GramPerKilometer; + + public void SetResultData(IModalDataContainer data) + { + DistanceKm = + data.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(); + Speed = + data.GetValues<MeterPerSecond>(ModalResultField.v_act).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble(); + + EngineSpeedAvg = + data.GetValues<PerSecond>(ModalResultField.n_eng_avg).Select(x => x.ConvertTo().Rounds.Per.Minute).ToDouble(); + EngineTorqueAvg = data.GetValues<NewtonMeter>(ModalResultField.T_eng_fcmap).ToDouble(); + + AverageSpeed = data.Speed(); + FcLiterPer100Km = data.FuelConsumptionFinalLiterPer100Kilometer() ?? 0.SI(); + + + Co2GramPerKilometer = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter; + } + } + + /// <summary> /// the writer which actually persists the stream (either to file or somewhere else). /// </summary> @@ -92,6 +126,21 @@ namespace TUGraz.VectoCore.OutputData.PDF _writer = writer; } + + /// <summary> + /// Adds the result of one run for the specific mission and loading. If all runs finished (given by the resultCount) the report will be written. + /// </summary> + /// <param name="entry"></param> + /// <param name="loadingType">Type of the loading.</param> + /// <param name="mission">The mission.</param> + /// <param name="modData">The mod data.</param> + [MethodImpl(MethodImplOptions.Synchronized)] + protected override void DoAddResult(ResultEntry entry, LoadingType loadingType, Mission mission, + IModalDataContainer modData) + { + entry.SetResultData(modData); + } + /// <summary> /// Creates the report and writes it to a pdf file. /// </summary> @@ -99,13 +148,15 @@ namespace TUGraz.VectoCore.OutputData.PDF { ReportDate = DateTime.Now.ToUniversalTime().ToString(CultureInfo.InvariantCulture); - var tasks = new List<Task<Stream>> { Task.Run(() => CreateTitlePage(Missions)) }; - tasks.AddRange(Missions - .OrderBy(m => m.Key) - .Select((m, i) => Task.Run(() => CreateCyclePage(m.Value, i + 2, Missions.Count + 1)))); + var pages = new List<Stream>() { + CreateTitlePage(Missions) + }; + //tasks.AddRange( + pages.AddRange(Missions.OrderBy(m => m.Key) + .Select((m, i) => CreateCyclePage(m.Value, i + 2, Missions.Count + 1))); - Task.WaitAll(tasks.Cast<Task>().ToArray()); - var pages = tasks.Select(t => t.Result); + //Task.WaitAll(tasks.Cast<Task>().ToArray()); + // = tasks.Select(t => t.Result); MergeDocuments(pages, _writer.WriteStream(ReportType.DeclarationReportPdf)); } @@ -131,7 +182,7 @@ namespace TUGraz.VectoCore.OutputData.PDF /// </summary> /// <param name="missions">The missions.</param> /// <returns>the out stream of the pdf stamper with the title page.</returns> - private Stream CreateTitlePage(Dictionary<MissionType, ResultContainer> missions) + private Stream CreateTitlePage(Dictionary<MissionType, ResultContainer<ResultEntry>> missions) { var stream = new MemoryStream(); var resourceName = string.Format("{0}.Report.title{1}CyclesTemplate.pdf", @@ -166,19 +217,17 @@ namespace TUGraz.VectoCore.OutputData.PDF var data = results.ModData[LoadingType.ReferenceLoad]; pdfFields.SetField("Loading" + i, results.Mission.RefLoad.ConvertTo().Ton.ToOutputFormat(1) + " t"); - pdfFields.SetField("Speed" + i, data.Speed().ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1) + " km/h"); + pdfFields.SetField("Speed" + i, data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1) + " km/h"); - var fcLiterPer100Km = data.FuelConsumptionFinalLiterPer100Kilometer() ?? 0.SI(); - pdfFields.SetField("FC" + i, fcLiterPer100Km.ToOutputFormat(1)); + pdfFields.SetField("FC" + i, data.FcLiterPer100Km.ToOutputFormat(1)); var loadingTon = results.Mission.RefLoad.ConvertTo().Ton; - var fcLiterPer100Tonkm = fcLiterPer100Km / loadingTon; + var fcLiterPer100Tonkm = data.FcLiterPer100Km / loadingTon; pdfFields.SetField("FCt" + i, fcLiterPer100Tonkm.ToOutputFormat(1)); - var co2GrammPerKm = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter; - var co2GrammPerTonKm = co2GrammPerKm / loadingTon; + var co2GrammPerTonKm = data.Co2GramPerKilometer / loadingTon; - pdfFields.SetField("CO2" + i, co2GrammPerKm.ToOutputFormat(1)); + pdfFields.SetField("CO2" + i, data.Co2GramPerKilometer.ToOutputFormat(1)); pdfFields.SetField("CO2t" + i, co2GrammPerTonKm.ToOutputFormat(1)); i++; } @@ -215,7 +264,7 @@ namespace TUGraz.VectoCore.OutputData.PDF /// <param name="currentPageNr">The current page nr.</param> /// <param name="pageCount">The page count.</param> /// <returns>the out stream of the pdfstamper for a single cycle page</returns> - private Stream CreateCyclePage(ResultContainer results, int currentPageNr, int pageCount) + private Stream CreateCyclePage(ResultContainer<ResultEntry> results, int currentPageNr, int pageCount) { var stream = new MemoryStream(); @@ -248,17 +297,15 @@ namespace TUGraz.VectoCore.OutputData.PDF var loadAppendix = loadingType.GetShortName(); pdfFields.SetField("Load" + loadAppendix, loadingTon.ToOutputFormat(1) + " t"); - pdfFields.SetField("Speed" + loadAppendix, data.Speed().ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1)); + pdfFields.SetField("Speed" + loadAppendix, data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.ToOutputFormat(1)); - var fcLiterPer100Km = data.FuelConsumptionFinalLiterPer100Kilometer() ?? 0.SI(); - pdfFields.SetField("FCkm" + loadAppendix, fcLiterPer100Km.ToOutputFormat(1)); + pdfFields.SetField("FCkm" + loadAppendix, data.FcLiterPer100Km.ToOutputFormat(1)); pdfFields.SetField("FCtkm" + loadAppendix, - loadingTon.IsEqual(0) ? "-" : (fcLiterPer100Km / loadingTon).ToOutputFormat(1)); + loadingTon.IsEqual(0) ? "-" : (data.FcLiterPer100Km / loadingTon).ToOutputFormat(1)); - var co2GrammPerKm = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter; - pdfFields.SetField("CO2km" + loadAppendix, co2GrammPerKm.ToOutputFormat(1)); + pdfFields.SetField("CO2km" + loadAppendix, data.Co2GramPerKilometer.ToOutputFormat(1)); pdfFields.SetField("CO2tkm" + loadAppendix, - loadingTon.IsEqual(0) ? "-" : (co2GrammPerKm / loadingTon).ToOutputFormat(1)); + loadingTon.IsEqual(0) ? "-" : (data.Co2GramPerKilometer / loadingTon).ToOutputFormat(1)); } var content = stamper.GetOverContent(1); @@ -268,7 +315,7 @@ namespace TUGraz.VectoCore.OutputData.PDF img.SetAbsolutePosition(600, 475); content.AddImage(img); - img = Image.GetInstance(DrawCycleChart(results), BaseColor.WHITE); + img = Image.GetInstance(DrawCycleChart(results.MissionProfile, results.ModData), BaseColor.WHITE); img.ScaleAbsolute(780, 156); img.SetAbsolutePosition(17, 270); content.AddImage(img); @@ -311,7 +358,7 @@ namespace TUGraz.VectoCore.OutputData.PDF /// </summary> /// <param name="missions">The missions.</param> /// <returns></returns> - private static Bitmap DrawCo2MissionsChart(Dictionary<MissionType, ResultContainer> missions) + private static Bitmap DrawCo2MissionsChart(Dictionary<MissionType, ResultContainer<ResultEntry>> missions) { var co2Chart = new Chart { Width = 1500, Height = 700 }; co2Chart.Legends.Add(new Legend("main") { @@ -340,8 +387,7 @@ namespace TUGraz.VectoCore.OutputData.PDF var data = missionResult.Value.ModData[LoadingType.ReferenceLoad]; var loadingTon = missionResult.Value.Mission.Loadings[LoadingType.ReferenceLoad].ConvertTo().Ton; - var co2GrammPerTonKm = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter / - loadingTon; + var co2GrammPerTonKm = data.Co2GramPerKilometer / loadingTon; var series = new Series(missionResult.Key + " (Ref. load.)"); var dataPoint = new DataPoint { @@ -367,7 +413,7 @@ namespace TUGraz.VectoCore.OutputData.PDF /// </summary> /// <param name="missions">The missions.</param> /// <returns></returns> - private static Bitmap DrawCo2SpeedChart(Dictionary<MissionType, ResultContainer> missions) + private static Bitmap DrawCo2SpeedChart(Dictionary<MissionType, ResultContainer<ResultEntry>> missions) { var co2SpeedChart = new Chart { Width = 1500, Height = 700 }; co2SpeedChart.Legends.Add(new Legend("main") { @@ -404,14 +450,14 @@ namespace TUGraz.VectoCore.OutputData.PDF foreach (var pair in missionResult.Value.ModData) { var data = missionResult.Value.ModData[pair.Key]; - var co2GramPerKilometer = (data.CO2PerMeter() ?? 0.SI<KilogramPerMeter>()).ConvertTo().Gramm.Per.Kilo.Meter; var loadingTon = missionResult.Value.Mission.Loadings[pair.Key].ConvertTo().Ton; - var point = new DataPoint(data.Speed().ConvertTo().Kilo.Meter.Per.Hour.Value(), co2GramPerKilometer.Value()) { - Label = string.Format(CultureInfo.InvariantCulture, "{0:0.0} t", loadingTon.Value()), - Font = new Font("Helvetica", 16), - LabelBackColor = Color.White - }; + var point = new DataPoint(data.AverageSpeed.ConvertTo().Kilo.Meter.Per.Hour.Value(), + data.Co2GramPerKilometer.Value()) { + Label = string.Format(CultureInfo.InvariantCulture, "{0:0.0} t", loadingTon.Value()), + Font = new Font("Helvetica", 16), + LabelBackColor = Color.White + }; if (pair.Key != LoadingType.ReferenceLoad) { point.MarkerSize = 10; @@ -432,9 +478,10 @@ namespace TUGraz.VectoCore.OutputData.PDF /// <summary> /// Draws the cycle chart for a cycle page. /// </summary> - /// <param name="results">The results.</param> + /// <param name="profile">The speed/altitude profile of the mission</param> + /// <param name="results">results for different loadings</param> /// <returns></returns> - private static Bitmap DrawCycleChart(ResultContainer results) + private static Bitmap DrawCycleChart(MissionProfile profile, Dictionary<LoadingType, ResultEntry> results) { var missionCycleChart = new Chart { Width = 2000, Height = 400 }; missionCycleChart.Legends.Add(new Legend("main") { @@ -479,24 +526,17 @@ namespace TUGraz.VectoCore.OutputData.PDF YAxisType = AxisType.Secondary }; - var m = results.ModData.First().Value; - var distanceKm = m.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(); - - altitude.Points.DataBindXY(distanceKm, m.GetValues<Meter>(ModalResultField.altitude).ToDouble()); + altitude.Points.DataBindXY(profile.DistanceKm, profile.Altitude); missionCycleChart.Series.Add(altitude); var targetSpeed = new Series { ChartType = SeriesChartType.FastLine, BorderWidth = 3, Name = "Target speed" }; - targetSpeed.Points.DataBindXY(distanceKm, - m.GetValues<MeterPerSecond>(ModalResultField.v_targ).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble()); + targetSpeed.Points.DataBindXY(profile.DistanceKm, profile.TargetSpeed); missionCycleChart.Series.Add(targetSpeed); - foreach (var result in results.ModData) { + foreach (var result in results) { var name = result.Key.ToString(); - var values = result.Value; var series = new Series { ChartType = SeriesChartType.FastLine, Name = name }; - series.Points.DataBindXY( - values.GetValues<Meter>(ModalResultField.dist).Select(v => v.ConvertTo().Kilo.Meter).ToDouble(), - values.GetValues<MeterPerSecond>(ModalResultField.v_act).Select(v => v.ConvertTo().Kilo.Meter.Per.Hour).ToDouble()); + series.Points.DataBindXY(result.Value.DistanceKm, result.Value.Speed); missionCycleChart.Series.Add(series); } missionCycleChart.Update(); @@ -512,7 +552,7 @@ namespace TUGraz.VectoCore.OutputData.PDF /// <param name="modData">The mod data.</param> /// <param name="flc">The FLC.</param> /// <returns></returns> - private static Bitmap DrawOperatingPointsChart(IModalDataContainer modData, FullLoadCurve flc) + private static Bitmap DrawOperatingPointsChart(ResultEntry modData, FullLoadCurve flc) { var operatingPointsChart = new Chart { Width = 1000, Height = 427 }; operatingPointsChart.Legends.Add(new Legend("main") { @@ -560,9 +600,7 @@ namespace TUGraz.VectoCore.OutputData.PDF operatingPointsChart.Series.Add(dragLoadCurve); var dataPoints = new Series("load points (Ref. load.)") { ChartType = SeriesChartType.Point, Color = Color.Red }; - dataPoints.Points.DataBindXY( - modData.GetValues<PerSecond>(ModalResultField.n_eng_avg).Select(x => x.ConvertTo().Rounds.Per.Minute).ToDouble(), - modData.GetValues<NewtonMeter>(ModalResultField.T_eng_fcmap).ToDouble()); + dataPoints.Points.DataBindXY(modData.EngineSpeedAvg, modData.EngineTorqueAvg); operatingPointsChart.Series.Add(dataPoints); operatingPointsChart.Update(); diff --git a/VectoCore/VectoCore/Properties/Version.cs b/VectoCore/VectoCore/Properties/Version.cs index 73b9ecba332c38db4000cbdb0ad93c0c1c5dbd3b..0d26cb08f0a6b92225d3ee59442ea66c40918c13 100644 --- a/VectoCore/VectoCore/Properties/Version.cs +++ b/VectoCore/VectoCore/Properties/Version.cs @@ -30,5 +30,5 @@ */ using System.Reflection; -[assembly: AssemblyVersion("3.1.0.683")] -[assembly: AssemblyFileVersion("3.1.0.683")] +[assembly: AssemblyVersion("3.1.0.718")] +[assembly: AssemblyFileVersion("3.1.0.718")] diff --git a/VectoCore/VectoCore/Utils/VectoCSVFile.cs b/VectoCore/VectoCore/Utils/VectoCSVFile.cs index 0e5b17ff5e7225e775a86f9ad437baa15a682433..9fe3760be8d039ab2691ad241c3276641c561501 100644 --- a/VectoCore/VectoCore/Utils/VectoCSVFile.cs +++ b/VectoCore/VectoCore/Utils/VectoCSVFile.cs @@ -95,7 +95,7 @@ namespace TUGraz.VectoCore.Utils public static TableData ReadStream(Stream stream, bool ignoreEmptyColumns = false, bool fullHeader = false, string source = null) { - var retVal = new TableData(source); + var retVal = new TableData(source, DataSourceType.Embedded); ReadCSV(retVal, stream, ignoreEmptyColumns, fullHeader); return retVal; } diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index c0da5d8378cda7901d960fc45bac6e4f5dc46cd8..0f2e04640fc27c687a8bf4433a2c17eb3b6e9d76 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -127,6 +127,7 @@ <Compile Include="InputData\Reader\FullLoadCurveReader.cs" /> <Compile Include="InputData\Reader\Impl\AbstractVectoRunDataFactory.cs" /> <Compile Include="InputData\Reader\Impl\DeclarationModeVectoRunDataFactory.cs" /> + <Compile Include="InputData\Reader\Impl\DrivingCycleProxy.cs" /> <Compile Include="InputData\Reader\Impl\EngineeringModeVectoRunDataFactory.cs" /> <Compile Include="InputData\Reader\Impl\EngineOnlyVectoRunDataFactory.cs" /> <Compile Include="InputData\Reader\ShiftPolygonReader.cs" /> diff --git a/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs b/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs index 814541986a7086f15dc3d7e90627ee83c993efd8..145eb9cc26a81fae50a1947ae33853de301ffbb1 100644 --- a/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs +++ b/VectoCore/VectoCoreTest/Integration/SimpleDrivingCycles.cs @@ -30,6 +30,7 @@ */ using System.Diagnostics.CodeAnalysis; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -279,7 +280,8 @@ namespace TUGraz.VectoCore.Tests.Integration public static DrivingCycleData ReadDeclarationCycle(string missionType) { var cycleData = - RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + ".vdri"); + RessourceHelper.ReadStream(DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." + missionType + + Constants.FileExtensions.CycleFile); var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false); return cycle; } diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs index 8983bfcca8c8e8200f34283a7b7cdfad9b735566..894dfe71f6e959d891515fef56a1a5f52bf3be74 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/DistanceCycleDataTest.cs @@ -31,6 +31,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Tests.Integration; @@ -125,7 +126,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData public void CycleAltitudeTest() { var missionType = "LongHaul"; - var stream = RessourceHelper.ReadStream(ResourceNamespace + "MissionCycles." + missionType + ".vdri"); + var stream = + RessourceHelper.ReadStream(ResourceNamespace + "MissionCycles." + missionType + Constants.FileExtensions.CycleFile); var cycleData = DrivingCycleDataReader.ReadFromStream(stream, CycleType.DistanceBased, "", false); foreach (var entry in cycleData.Entries) { diff --git a/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs b/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs index 82476b41f076ad5e42dc97af31cdc472226ef65b..b74dd43c8624c43af046873cbdf7d2c1f12a0c17 100644 --- a/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs +++ b/VectoCore/VectoCoreTest/Utils/MockAuxiliaryDemand.cs @@ -115,5 +115,7 @@ namespace TUGraz.VectoCore.Tests.Utils { return new List<DrivingCycleData.DrivingCycleEntry>(); } + + public void FinishSimulation() {} } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs index e88c6e1ed20236fa0dcf488ec5030a93866ebc91..f0a08e3fbeb543b0c1734f503aac1bd7266f4e99 100644 --- a/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockModalDataContainer.cs @@ -114,6 +114,16 @@ namespace TUGraz.VectoCore.Tests.Utils Auxiliaries[id] = Data.Columns[auxColName]; } + public void Dispose() + { + throw new NotImplementedException(); + } + + public void FinishSimulation() + { + Data.Rows.Clear(); + } + public string RunName { get; set; } public string CycleName { get; set; } public string RunSuffix { get; set; }