diff --git a/VECTO/GUI/IHPCForm.vb b/VECTO/GUI/IHPCForm.vb index 3e7404fc653ee46ed2f1567ef664718076c6109e..2807748e52373a9fb76bdc69e1227f6554b2682f 100644 --- a/VECTO/GUI/IHPCForm.vb +++ b/VECTO/GUI/IHPCForm.vb @@ -1,4 +1,5 @@ Imports System.IO +Imports TUGraz.VECTO.Input_Files Imports TUGraz.VectoCommon.InputData Imports TUGraz.VectoCommon.Utils Imports TUGraz.VectoCore.InputData.FileIO.JSON @@ -18,11 +19,11 @@ Public Class IHPCForm Public Sub ReadIHPCFile(file As String) Dim ihpcData = JSONInputDataFactory.ReadIHPCEngineeringInputData(file, True) - + _ihpcFilePath = file tbModel.Text = ihpcData.Model tbInertia.Text = ihpcData.Inertia.ToGUIFormat() tbThermalOverload.Text = ihpcData.OverloadRecoveryFactor.ToGUIFormat() - tbDragCurve.Text = ihpcData.DragCurve.Source + tbDragCurve.Text = GetRelativePath(ihpcData.DragCurve.Source, Path.GetDirectoryName(_ihpcFilePath)) SetVoltageLevelLow(ihpcData.VoltageLevels.First()) SetVoltageLevelHigh(ihpcData.VoltageLevels.Last()) @@ -39,7 +40,7 @@ Public Class IHPCForm tbOverloadTime1.Text = voltageLevel.OverloadTime.ToGUIFormat() tbOverloadTorque1.Text = voltageLevel.OverloadTorque.ToGUIFormat() tbOverloadTorqueSpeed1.Text = voltageLevel.OverloadTestSpeed.AsRPM.ToGUIFormat() - tbFLCurve1.Text = voltageLevel.FullLoadCurve.Source + tbFLCurve1.Text = GetRelativePath(voltageLevel.FullLoadCurve.Source, path.GetDirectoryName(_ihpcFilePath)) SetPowerMapEntries(_lvPowerMap1, voltageLevel.PowerMap) End Sub @@ -52,7 +53,7 @@ Public Class IHPCForm tbOverloadTime2.Text = voltageLevel.OverloadTime.ToGUIFormat() tbOverloadTorque2.Text = voltageLevel.OverloadTorque.ToGUIFormat() tbOverloadTorqueSpeed2.Text = voltageLevel.OverloadTestSpeed.AsRPM.ToGUIFormat() - tbFLCurve2.Text = voltageLevel.FullLoadCurve.Source + tbFLCurve2.Text = GetRelativePath(voltageLevel.FullLoadCurve.Source, Path.GetDirectoryName(_ihpcFilePath)) SetPowerMapEntries(_lvPowerMap2, voltageLevel.PowerMap) End Sub @@ -67,7 +68,7 @@ Public Class IHPCForm Private Function CreateListViewItem(axleNumber As Integer, filepath As String) As ListViewItem Dim retVal As New ListViewItem retVal.SubItems(0).Text = axleNumber.ToGUIFormat() - retVal.SubItems.Add(filepath) + retVal.SubItems.Add(GetRelativePath(filepath, Path.GetDirectoryName(_ihpcFilePath))) Return retVal End Function @@ -116,20 +117,20 @@ Public Class IHPCForm #Region "Events" Private Sub btDragCurve_Click(sender As Object, e As EventArgs) Handles btDragCurve.Click - If IHPCDragCurveFileBrowser.OpenDialog(FileRepl(tbDragCurve.Text, GetPath(_dragCurveFilePath))) - _tbDragCurve.Text = GetFilenameWithoutDirectory(IHPCDragCurveFileBrowser.Files(0), GetPath(_dragCurveFilePath)) + If IHPCDragCurveFileBrowser.OpenDialog(FileRepl(tbDragCurve.Text, GetPath(_ihpcFilePath))) + _tbDragCurve.Text = GetFilenameWithoutDirectory(IHPCDragCurveFileBrowser.Files(0), GetPath(_ihpcFilePath)) End If End Sub Private Sub btFLCurveFile1_Click(sender As Object, e As EventArgs) Handles btFLCurveFile1.Click - If IHPCFullLoadCurveFileBrowser.OpenDialog(FileRepl(tbFLCurve1.Text, GetPath(_flCurveFilePath1))) - _tbFLCurve1.Text = GetFilenameWithoutDirectory(IHPCFullLoadCurveFileBrowser.Files(0), GetPath(_flCurveFilePath1)) + If IHPCFullLoadCurveFileBrowser.OpenDialog(FileRepl(tbFLCurve1.Text, GetPath(_ihpcFilePath))) + _tbFLCurve1.Text = GetFilenameWithoutDirectory(IHPCFullLoadCurveFileBrowser.Files(0), GetPath(_ihpcFilePath)) End If End Sub Private Sub btFLCurveFile2_Click(sender As Object, e As EventArgs) Handles btFLCurveFile2.Click - If IHPCFullLoadCurveFileBrowser.OpenDialog(FileRepl(tbFLCurve2.Text, GetPath(_flCurveFilePath2))) - _tbFLCurve2.Text = GetFilenameWithoutDirectory(IHPCFullLoadCurveFileBrowser.Files(0), GetPath(_flCurveFilePath2)) + If IHPCFullLoadCurveFileBrowser.OpenDialog(FileRepl(tbFLCurve2.Text, GetPath(_ihpcFilePath))) + _tbFLCurve2.Text = GetFilenameWithoutDirectory(IHPCFullLoadCurveFileBrowser.Files(0), GetPath(_ihpcFilePath)) End If End Sub @@ -184,6 +185,7 @@ Public Class IHPCForm IHPCPowerMapInputDialog.tbGear.Text = entry.SubItems(0).Text IHPCPowerMapInputDialog.tbInputFile.Text = entry.SubItems(1).Text IHPCPowerMapInputDialog.tbGear.Focus() + IHPCPowerMapInputDialog.IHPCPath = GetPath(_ihpcFilePath) If IHPCPowerMapInputDialog.ShowDialog() = DialogResult.OK Then entry.SubItems(0).Text = IHPCPowerMapInputDialog.tbGear.Text @@ -275,7 +277,7 @@ Public Class IHPCForm End Function Private Function SaveIHPCToFile(ByVal ihpcFilePath As String) As Boolean - Dim ihpcInputData = New IHPCInputData + Dim ihpcInputData = New IHPCInputData(ihpcFilePath) ihpcInputData.SetCommonEntries(tbModel.Text, tbInertia.Text, tbDragCurve.Text, tbThermalOverload.Text) ihpcInputData.SetVoltageLevelEntries(tbVoltage1.Text, tbContinuousTorque1.Text, tbContinuousTorqueSpeed1.Text, @@ -286,7 +288,7 @@ Public Class IHPCForm tbFLCurve2.Text, lvPowerMap2) - If Not ihpcInputData.SaveFile(ihpcFilePath) Then + If Not ihpcInputData.SaveFile() Then MsgBox("Cannot save to " & ihpcFilePath, MsgBoxStyle.Critical) Return False End If @@ -355,7 +357,9 @@ Public Class IHPCForm End Function Private Function ValidateDragCurve() As Boolean - If Not File.Exists(tbDragCurve.Text) Then + dim tmp = new SubPath() + tmp.Init(GetPath(_ihpcFilePath), tbDragCurve.Text) + If Not File.Exists(tmp.FullPath) Then ShowErrorMessageBox("No valid Drag Curve file path given", tbDragCurve, False) Return False End If @@ -418,7 +422,9 @@ Public Class IHPCForm End Function Private Function ValidateFullLoadCurve(tb As TextBox) As Boolean - If Not File.Exists(tb.Text) Then + dim tmp = new SubPath() + tmp.Init(GetPath(_ihpcFilePath), tb.Text) + If Not File.Exists(tmp.FullPath) Then ShowErrorMessageBox("No valid Full Load Curve file path given", tb, False) Return False End If diff --git a/VECTO/GUI/IHPCPowerMapInputDialog.vb b/VECTO/GUI/IHPCPowerMapInputDialog.vb index 9a002155b8dfe00bb25e599dc7d57ac874821210..5dcd9d6958fa61d15a51893a55a7910619f31b46 100644 --- a/VECTO/GUI/IHPCPowerMapInputDialog.vb +++ b/VECTO/GUI/IHPCPowerMapInputDialog.vb @@ -1,8 +1,10 @@ Imports System.IO +Imports TUGraz.VECTO.Input_Files Public Class IHPCPowerMapInputDialog Private _inputFilePath As String + Public IHPCPath As String public Sub Clear() _tbGear.Text = "" @@ -34,7 +36,9 @@ Public Class IHPCPowerMapInputDialog Return End If - If Not File.Exists(tbInputFile.Text) Then + Dim tmp As SubPath = New SubPath() + tmp.Init(IHPCPath, tbInputFile.Text) + If Not File.Exists(tmp.FullPath) Then MsgBox("Invalid input no valid file path given") _tbInputFile.Focus() Return @@ -57,8 +61,8 @@ Public Class IHPCPowerMapInputDialog End Sub Private Sub btAddFilePath_Click(sender As Object, e As EventArgs) Handles btAddFilePath.Click - If IHPCPowerMapFileBrowser.OpenDialog(FileRepl(tbInputFile.Text, GetPath(_inputFilePath))) - tbInputFile.Text = GetFilenameWithoutDirectory(IHPCPowerMapFileBrowser.Files(0), GetPath(_inputFilePath)) + If IHPCPowerMapFileBrowser.OpenDialog(FileRepl(tbInputFile.Text, IHPCPath)) + tbInputFile.Text = GetFilenameWithoutDirectory(IHPCPowerMapFileBrowser.Files(0),IHPCPath) End If End Sub diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb index 15b78f808295e9190919150a5ea6931078f6bcdf..667589cdfe467474ae01c3f2e037ce2ce5d13569 100644 --- a/VECTO/GUI/VectoJobForm.vb +++ b/VECTO/GUI/VectoJobForm.vb @@ -1063,11 +1063,12 @@ Public Class VectoJobForm pnShiftParams.Enabled = True gbEngineStopStart.Visible = False Case VectoSimulationJobType.IHPC - pnEngine.Enabled = False + pnEngine.Enabled = True pnGearbox.Enabled = True - GrAuxMech.Enabled = False + GrAuxMech.Enabled = True pnShiftParams.Enabled = True gbEngineStopStart.Visible = False + pnHybridStrategy.Enabled = true Case VectoSimulationJobType.IEPC_E pnEngine.Enabled = False pnGearbox.Enabled = True diff --git a/VECTO/GUI/VehicleForm.vb b/VECTO/GUI/VehicleForm.vb index 476cba239928b4327e75aa7e1f1e8261257a110a..8a61e13b6fcb19f7c1b4472a2c8c9b606834a64d 100644 --- a/VECTO/GUI/VehicleForm.vb +++ b/VECTO/GUI/VehicleForm.vb @@ -814,7 +814,8 @@ Public Class VehicleForm veh.RetarderRatio = TbRtRatio.Text.ToDouble(0) veh.RetarderLossMapFile.Init(GetPath(file), TbRtPath.Text) - If (VehicleType = VectoSimulationJobType.ConventionalVehicle OrElse VehicleType = VectoSimulationJobType.ParallelHybridVehicle OrElse VehicleType = VectoSimulationJobType.SerialHybridVehicle) Then + If (VehicleType = VectoSimulationJobType.ConventionalVehicle OrElse VehicleType = VectoSimulationJobType.ParallelHybridVehicle _ + OrElse VehicleType = VectoSimulationJobType.SerialHybridVehicle OrElse VehicleType = VectoSimulationJobType.IHPC) Then veh.VehicleidlingSpeed = _tbVehIdlingSpeed.Text.ToDouble(0).RPMtoRad() veh.AngledriveType = CType(cbAngledriveType.SelectedValue, AngledriveType) @@ -876,10 +877,22 @@ Public Class VehicleForm If (veh.ElectricMotorPosition = PowertrainPosition.HybridP2_5) Then veh.ElectricMotorPerGearRatios = lvRatioPerGear.Items.Cast(Of ListViewItem).Select(Function(item) item.SubItems(RatiosPerGearTbl.Ratio).Text.ToDouble(0)).ToArray() End If + end if if (VehicleType = VectoSimulationJobType.IEPC_S OrElse VehicleType = VectoSimulationJobType.IEPC_E) Then veh.IEPCFile.Init(GetPath(file), tbIEPCFilePath.Text) End If + if (VehicleType = VectoSimulationJobType.IHPC) Then + If (tbIHPCFilePath.Text = "") Then + MsgBox("IHPC File is required.") + tcVehicleComponents.SelectedTab = tbIHPC + tbIHPCFilePath.Focus() + End If + veh.ElectricMotorFile.Init(GetPath(file), tbIHPCFilePath.Text) + veh.ElectricMotorPosition = PowertrainPosition.IHPC + veh.ElectricMotorCount = 1 + veh.ElectricMotorRatio = 1 + End If End If If (VehicleType = VectoSimulationJobType.SerialHybridVehicle OrElse VehicleType = VectoSimulationJobType.IEPC_S) Then diff --git a/VECTO/Input Files/IHPCInputData.vb b/VECTO/Input Files/IHPCInputData.vb index 80eef70e03bd75ef399b52a1cd49083d3d6cf283..69f24a0f6175b4c3854aaecff61c52406f5adbb2 100644 --- a/VECTO/Input Files/IHPCInputData.vb +++ b/VECTO/Input Files/IHPCInputData.vb @@ -1,4 +1,5 @@ Imports System.IO +Imports TUGraz.VECTO.Input_Files Imports TUGraz.VectoCommon.Exceptions Imports TUGraz.VectoCommon.InputData Imports TUGraz.VectoCommon.Models @@ -17,16 +18,15 @@ Public Class IHPCInputData Private _overloadRecoveryFactor As Double private _filePath As String - Public Sub New () + Public Sub New (file As String) _voltageLevels = New List(Of IElectricMotorVoltageLevel)() + _filePath = file End Sub - Public Function SaveFile(filePath As String) As Boolean - _filePath = filePath - + Public Function SaveFile() As Boolean Try Dim writer = New JSONFileWriter() - writer.SaveIHPC(Me, filePath, Cfg.DeclMode) + writer.SaveIHPC(Me, _filePath, Cfg.DeclMode) Catch ex As Exception MsgBox("Failed to write IHPC file: " + ex.Message) Return False @@ -39,10 +39,12 @@ Public Class IHPCInputData thermalOverloadRecoverFactor As String ) _model = model _inertia = inertia.ToDouble().SI(Of KilogramSquareMeter) - If Not File.Exists(dragCurveFilePath) Then + Dim tmp as SubPath = new SubPath() + tmp.Init(GetPath(_filePath), dragCurveFilePath) + If Not File.Exists(tmp.FullPath) Then Throw New VectoException("Drag Curve is missing or invalid") Else - _dragCurve = VectoCSVFile.Read(dragCurveFilePath) + _dragCurve = VectoCSVFile.Read(tmp.FullPath) End If _overloadRecoveryFactor = thermalOverloadRecoverFactor.ToDouble() @@ -60,10 +62,12 @@ Public Class IHPCInputData level.OverloadTime = overloadTime.ToDouble().SI(Of Second) level.OverloadTorque = overloadTorque.ToDouble().SI(Of NewtonMeter) level.OverloadTestSpeed = overloadTorqueSpeed.ToDouble().RPMtoRad() - If Not File.Exists(fullLoadCurve) Then + Dim tmp as SubPath = new SubPath() + tmp.Init(GetPath(_filePath), fullLoadCurve) + If Not File.Exists(tmp.FullPath) Then Throw New VectoException("Full-Load Curve is missing or invalid") Else - level.FullLoadCurve = VectoCSVFile.Read(fullLoadCurve) + level.FullLoadCurve = VectoCSVFile.Read(tmp.FullPath) End If level.PowerMap = GetPowerMap(powerMap) @@ -77,11 +81,12 @@ Public Class IHPCInputData For Each entry As ListViewItem In powerMap.Items Dim currentEntry = New JSONElectricMotorPowerMap currentEntry.Gear = entry.SubItems(0).Text.ToInt() - - If Not File.Exists(entry.SubItems(1).Text) Then + Dim tmp as SubPath = new SubPath() + tmp.Init(GetPath(_filePath), entry.SubItems(1).Text) + If Not File.Exists(tmp.FullPath) Then Throw New VectoException("Power Map is missing or invalid") Else - currentEntry.PowerMap = VectoCSVFile.Read(entry.SubItems(1).Text) + currentEntry.PowerMap = VectoCSVFile.Read(tmp.FullPath) End If powerMaps.Add(currentEntry) Next diff --git a/VECTO/Input Files/Vehicle.vb b/VECTO/Input Files/Vehicle.vb index 680773de38b272112a026148e044850c2ad836df..2b4958e2cea1d8973fc5181f72d56c251177dc54 100644 --- a/VECTO/Input Files/Vehicle.vb +++ b/VECTO/Input Files/Vehicle.vb @@ -1080,7 +1080,10 @@ Public Class ElectricMachinesWrapper Public ReadOnly Property Entries As IList(Of ElectricMachineEntry(Of IElectricMotorDeclarationInputData)) Implements IElectricMachinesDeclarationInputData.Entries Get Dim retval As IList(Of ElectricMachineEntry(Of IElectricMotorDeclarationInputData)) = New List(Of ElectricMachineEntry(Of IElectricMotorDeclarationInputData)) - If (Vehicle.VehicleType = VectoSimulationJobType.BatteryElectricVehicle OrElse Vehicle.VehicleType = VectoSimulationJobType.ParallelHybridVehicle OrElse Vehicle.VehicleType = VectoSimulationJobType.SerialHybridVehicle) Then + If (Vehicle.VehicleType = VectoSimulationJobType.BatteryElectricVehicle OrElse + Vehicle.VehicleType = VectoSimulationJobType.ParallelHybridVehicle OrElse + Vehicle.VehicleType = VectoSimulationJobType.SerialHybridVehicle OrElse + Vehicle.VehicleType = VectoSimulationJobType.IHPC) Then retval.Add(New ElectricMachineEntry(Of IElectricMotorDeclarationInputData) With { .ElectricMachine = new ElectricMachineWrapper(Vehicle.ElectricMotorFile), @@ -1108,11 +1111,15 @@ Public Class ElectricMachinesWrapper Get Dim retval As IList(Of ElectricMachineEntry(Of IElectricMotorEngineeringInputData)) = New List(Of ElectricMachineEntry(Of IElectricMotorEngineeringInputData)) - If (Vehicle.VehicleType = VectoSimulationJobType.BatteryElectricVehicle OrElse Vehicle.VehicleType = VectoSimulationJobType.ParallelHybridVehicle OrElse Vehicle.VehicleType = VectoSimulationJobType.SerialHybridVehicle) Then + If (Vehicle.VehicleType = VectoSimulationJobType.BatteryElectricVehicle OrElse + Vehicle.VehicleType = VectoSimulationJobType.ParallelHybridVehicle OrElse + Vehicle.VehicleType = VectoSimulationJobType.SerialHybridVehicle OrElse + Vehicle.VehicleType = VectoSimulationJobType.IHPC) Then + retval.Add(New ElectricMachineEntry(Of IElectricMotorEngineeringInputData) With { .ElectricMachine = new ElectricMachineWrapper(Vehicle.ElectricMotorFile), .MechanicalTransmissionEfficiency = If(IsNumeric(Vehicle.ElectricMotorMechLossMap.OriginalPath), Vehicle.ElectricMotorMechLossMap.OriginalPath.ToDouble(), double.NaN), - .MechanicalTransmissionLossMap = If(IsNumeric(Vehicle.ElectricMotorMechLossMap.OriginalPath), Nothing, VectoCSVFile.Read(Vehicle.ElectricMotorMechLossMap.FullPath)), + .MechanicalTransmissionLossMap = If(IsNumeric(Vehicle.ElectricMotorMechLossMap.OriginalPath) OrElse String.IsNullOrWhiteSpace(Vehicle.ElectricMotorMechLossMap.OriginalPath), Nothing, VectoCSVFile.Read(Vehicle.ElectricMotorMechLossMap.FullPath)), .Position = Vehicle.ElectricMotorPosition, .RatioADC = Vehicle.ElectricMotorRatio, .RatioPerGear = Vehicle.ElectricMotorPerGearRatios, diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 344bbdeb6500c9cff2604a6e34d40991b06b6f29..570e232cbe3bf8db691f0df70057d1c9ebbc53ec 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -936,9 +936,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter averageVoltage = (voltageLevels.Min(x => x.Voltage) + voltageLevels.Max(x => x.Voltage)) / 2.0; } - var lossMap = adcLossMap != null - ? TransmissionLossMapReader.CreateEmADCLossMap(adcLossMap, ratio, "EM ADC LossMap") - : TransmissionLossMapReader.CreateEmADCLossMap(efficiency, ratio, "EM ADC LossMap Eff"); + var lossMap = powertrainPosition == PowertrainPosition.IHPC + ? TransmissionLossMapReader.CreateEmADCLossMap(1.0, 1.0, "EM ADC IHPC LossMap Eff") + : adcLossMap != null + ? TransmissionLossMapReader.CreateEmADCLossMap(adcLossMap, ratio, "EM ADC LossMap") + : TransmissionLossMapReader.CreateEmADCLossMap(efficiency, ratio, "EM ADC LossMap Eff"); var retVal = new ElectricMotorData() { EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels}, diff --git a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs index 713229a00598760c86c405ddf1742705ce4645ad..e58dd595b2a3d46e2c6808463a337e28624c34ad 100644 --- a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs +++ b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs @@ -36,7 +36,7 @@ public class JSONFileWriter : IOutputFileWriter private const int SHEVVectoJobFormatVersion = 11; private const int IEPCVectoJobFormatVersion = 12; - + private const int IHPCVectoJobFormatVersion = 13; #endregion @@ -387,6 +387,7 @@ public class JSONFileWriter : IOutputFileWriter break; case VectoSimulationJobType.ParallelHybridVehicle: case VectoSimulationJobType.SerialHybridVehicle: + case VectoSimulationJobType.IHPC: SaveHybridVehicle(vehicle, airdrag, retarder, pto, angledrive, filename, DeclMode); break; case VectoSimulationJobType.BatteryElectricVehicle: @@ -572,7 +573,7 @@ public class JSONFileWriter : IOutputFileWriter } body.Add("InitialSoC", vehicle.InitialSOC * 100); - body.Add("PowertrainConfiguration", vehicle.VehicleType == VectoSimulationJobType.SerialHybridVehicle ? "SerialHybrid" : "ParallelHybrid"); + body.Add("PowertrainConfiguration", vehicle.VehicleType == VectoSimulationJobType.SerialHybridVehicle ? "SerialHybrid" : vehicle.VehicleType == VectoSimulationJobType.IHPC ? "IHPC": "ParallelHybrid"); body.Add("ElectricMotors", GetElectricMotors(vehicle, basePath)); body.Add("Batteries", GetBattery(vehicle, basePath)); @@ -710,6 +711,9 @@ public class JSONFileWriter : IOutputFileWriter case VectoSimulationJobType.IEPC_S: SaveIEPCEJob(input, filename, DeclMode); break; + case VectoSimulationJobType.IHPC: + SaveIHPCJob(input, filename, DeclMode); + break; case VectoSimulationJobType.EngineOnlySimulation: SaveEngineOnlyJob(input, filename, DeclMode); break; @@ -718,12 +722,21 @@ public class JSONFileWriter : IOutputFileWriter } } - + private void SaveIHPCJob(IEngineeringInputDataProvider input, string filename, bool declMode) + { + DoSaveParallelHybridJob(input, filename, declMode, IHPCVectoJobFormatVersion); + } private void SaveParallelHybridJob(IEngineeringInputDataProvider input, string filename, bool declMode) + { + DoSaveParallelHybridJob(input, filename, declMode, PHEVVectoJobFormatVersion); + } + + private void DoSaveParallelHybridJob(IEngineeringInputDataProvider input, string filename, bool declMode, + int versionNumber) { var basePath = Path.GetDirectoryName(filename); - var header = GetHeader(PHEVVectoJobFormatVersion); + var header = GetHeader(versionNumber); var body = new Dictionary<string, object>(); // SavedInDeclMode = Cfg.DeclMode var job = input.JobInputData;