Forked from
VECTO / VECTO Sim
11526 commits behind the upstream repository.
-
Raphael LUZ authored
- restructured Demo / Default Data
Raphael LUZ authored- restructured Demo / Default Data
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
M_MAIN.vb 26.10 KiB
Imports System.Collections.Generic
Module M_MAIN
Public PHEMmode As tPHEMmode
Public JobFileList As List(Of String)
Public JobCycleList As List(Of String)
Public JobFile As String
Public GenFile As String
Public CycleFiles As New List(Of String)
Public CurrentCycleFile As String
Private jgen As Integer
Private jzkl As Integer
Private CyclesDim As Integer
Private FilesDim As Integer
Private jsubcycle As Integer
Private jsubcyclecount As Integer
Public FCerror As Boolean
Private SigFile As String
Friend Function NrOfRunStr() As String
If PHEMmode = tPHEMmode.ModeSTANDARD Then
'Return CStr(jgen * (CyclesDim + 1) + jzkl + 1) & "-" & CStr(jsubcycle)
Return CStr(jgen * (CyclesDim + 1) + jzkl + 1) & "(" & CStr(jsubcycle) & ")"
Else
Return CStr(jgen * (CyclesDim + 1) + jzkl + 1)
End If
End Function
Public Function VECTO() As tCalcResult
'Main program for all modes
Dim MsgStrBuilder As System.Text.StringBuilder
Dim i As Integer
Dim path0 As String
Dim JobAbortedByErr As Boolean
Dim CyclAbrtedByErr As Boolean
Dim MsgOut As Boolean
Dim MsgSrc As String
MsgSrc = "Main"
MsgStrBuilder = New System.Text.StringBuilder
'If there are any "unplanned" Aborts
VECTO = tCalcResult.Err
'Reset the fault
''ClearErrors()
'Specify Mode and Notification-msg
Select Case PHEMmode
Case tPHEMmode.ModeSTANDARD
WorkerMsg(tMsgID.Normal, "Starting VECTO STANDARD...", MsgSrc)
CyclesDim = 0
Case tPHEMmode.ModeBATCH
WorkerMsg(tMsgID.Normal, "Starting VECTO BATCH...", MsgSrc)
CyclesDim = JobCycleList.Count - 1
End Select
FilesDim = JobFileList.Count - 1
MsgOut = (PHEMmode = tPHEMmode.ModeSTANDARD)
'License check
If (PHEMmode = tPHEMmode.ModeBATCH) Then
If Not Lic.LicFeature(1) Then
WorkerMsg(tMsgID.Err, "Your license does not support BATCH mode!", MsgSrc)
GoTo lbErrBefore
End If
End If
If FilesDim = -1 Then
WorkerMsg(tMsgID.Err, "No Job Files defined.", MsgSrc)
GoTo lbErrBefore
End If
If CyclesDim = -1 And (PHEMmode = tPHEMmode.ModeBATCH) Then
WorkerMsg(tMsgID.Err, "No Driving Cycles defined.", MsgSrc)
GoTo lbErrBefore
End If
'Create BATCH Output-folder if necessary
If (PHEMmode = tPHEMmode.ModeBATCH) Then
Select Case UCase(Cfg.BATCHoutpath)
Case sKey.WorkDir
path0 = Cfg.WorkDPath
Case sKey.GenPath
GoTo lbSkip0
Case Else
path0 = Cfg.BATCHoutpath
End Select
If Not IO.Directory.Exists(path0) Then
Try
IO.Directory.CreateDirectory(path0)
Catch ex As Exception
WorkerMsg(tMsgID.Err, "Failed to create output directory " & path0 & " !", MsgSrc)
GoTo lbErrBefore
End Try
End If
End If
lbSkip0:
'MOD-Data class initialization
MODdata = New cMOD
'New signature file
Lic.FileSigning.NewFile()
'ERG-class initialization
WorkerMsg(tMsgID.Normal, "Analyzing input files", MsgSrc)
ERG = New cERG
VSUM = New cVSUM
If Not ERG.Init(JobFileList(0)) Then GoTo lbErrBefore
SigFile = Left(ERG.ErgFile, ERG.ErgFile.Length - 5) & ".vsig"
'Warning on invalid/unrealistic settings
If Cfg.AirDensity > 2 Then WorkerMsg(tMsgID.Err, "Air Density = " & Cfg.AirDensity & " ?!", MsgSrc)
'Notify
If Cfg.FCcorrection Then WorkerMsg(tMsgID.Normal, "HDV FC Correction ON", MsgSrc)
'Progbar-Init
WorkerProgInit()
'--------------------------------------------------------------------------------------------
' Calculation Loop for all Preset-cycles and Vehicles:
'
'**********************************************************************************************
'**************************************** Job loop ****************************************
'**********************************************************************************************
For jgen = 0 To FilesDim
jzkl = 0 '<= Damit NrOfRun stimmt
JobFile = fFileRepl(JobFileList(jgen))
GenFile = JobFile
WorkerJobStatus(jgen, "running...", tJobStatus.Running)
JobAbortedByErr = False
MSGwarn = 0
MSGerror = 0
'Check if Abort
If PHEMworker.CancellationPending Then GoTo lbAbort
'If error when read GEN
CurrentCycleFile = ""
'Reading the input files
' BATCH: Cycle from DRI list
' ADVANCE: Cycle is not read
If Not LESE() Then
JobAbortedByErr = True
GoTo lbNextJob
End If
'If optimizer is active, then read parameters here
If bOptOn Then OptInput()
'BATCH: Create Output-sub-folder
If (PHEMmode = tPHEMmode.ModeBATCH) And Cfg.ModOut And Cfg.BATCHoutSubD Then
Select Case UCase(Cfg.BATCHoutpath)
Case sKey.WorkDir
path0 = Cfg.WorkDPath
Case sKey.GenPath
path0 = fPATH(JobFile)
Case Else
path0 = Cfg.BATCHoutpath
End Select
path0 &= fFILE(JobFile, False) & "\"
If Not IO.Directory.Exists(path0) Then
Try
IO.Directory.CreateDirectory(path0)
Catch ex As Exception
WorkerMsg(tMsgID.Err, "Failed to create output directory " & path0 & " !", MsgSrc)
JobAbortedByErr = True
GoTo lbNextJob
End Try
End If
End If
'**********************************************************************************************
'************************************** Cycle-loop ****************************************
'**********************************************************************************************
For jzkl = 0 To CyclesDim
CyclAbrtedByErr = False
If PHEMmode = tPHEMmode.ModeBATCH Then
'ProgBar
ProgBarCtrl.ProgOverallStartInt = 100 * (jgen * (CyclesDim + 1) + jzkl) / ((FilesDim + 1) * (CyclesDim + 1))
ProgBarCtrl.PgroOverallEndInt = 100 * (jgen * (CyclesDim + 1) + jzkl + 1) / ((FilesDim + 1) * (CyclesDim + 1))
'BATCH mode: Cycle from GEN-file but not from DRI list
CycleFiles.Clear()
CycleFiles.Add(fFileRepl(JobCycleList(jzkl)))
'Status
WorkerMsg(tMsgID.NewJob, "Job: " & (NrOfRunStr()) & " / " & ((FilesDim + 1) * (CyclesDim + 1)) & " | " & fFILE(JobFile, True) & " | " & fFILE(CycleFiles(0), True), MsgSrc)
WorkerStatus("Current Job: " & (NrOfRunStr()) & " / " & ((FilesDim + 1) * (CyclesDim + 1)) & " | " & fFILE(JobFile, True) & " | " & fFILE(CycleFiles(0), True))
WorkerJobStatus(jgen, "running... " & jzkl + 1 & "/" & (CyclesDim + 1), tJobStatus.Running)
'Output name definition
Select Case UCase(Cfg.BATCHoutpath)
Case sKey.WorkDir
path0 = Cfg.WorkDPath
Case sKey.GenPath
path0 = fPATH(JobFile)
Case Else
path0 = Cfg.BATCHoutpath
End Select
If Cfg.BATCHoutSubD Then
MODdata.ModOutpName = path0 & fFILE(JobFile, False) & "\" & fFILE(JobFile, False) & "_" & fFILE(CycleFiles(0), False)
Else
MODdata.ModOutpName = path0 & fFILE(JobFile, False) & "_" & fFILE(CycleFiles(0), False)
End If
End If
'******************************************************************************************
'********************************** VECTO-Cycle-loop **********************************
jsubcyclecount = CycleFiles.Count
If jsubcyclecount = 0 Then
WorkerMsg(tMsgID.Err, "No driving cycle defined!", MsgSrc)
JobAbortedByErr = True
GoTo lbNextJob
End If
jsubcycle = 0
For Each CurrentCycleFile In CycleFiles
jsubcycle += 1
If PHEMmode = tPHEMmode.ModeSTANDARD Then
'ProgBar
ProgBarCtrl.ProgOverallStartInt = 100 * (jgen) / (FilesDim + 1) + 100 * (jsubcycle - 1) / jsubcyclecount * 1 / (FilesDim + 1)
ProgBarCtrl.PgroOverallEndInt = 100 * (jgen) / (FilesDim + 1) + 100 * jsubcycle / jsubcyclecount * 1 / (FilesDim + 1)
MODdata.ModOutpName = fFileWoExt(JobFile) & "_" & fFILE(CurrentCycleFile, False)
WorkerMsg(tMsgID.NewJob, "Job: " & NrOfRunStr() & " / " & ((FilesDim + 1) * (CyclesDim + 1)) & " | " & fFILE(JobFile, True) & " | " & fFILE(CurrentCycleFile, True), MsgSrc)
WorkerStatus("Current Job: " & NrOfRunStr() & " / " & ((FilesDim + 1) * (CyclesDim + 1)) & " | " & fFILE(JobFile, True) & " | " & fFILE(CurrentCycleFile, True))
WorkerJobStatus(jgen, "running... " & jsubcycle & "/" & jsubcyclecount, tJobStatus.Running)
End If
VSUM.ResetMe()
VSUM.FilePath = MODdata.ModOutpName & ".vres"
'TODO: Loading-loop
'***************************** VECTO-loading-loop *********************************
'**************************************************************************************
'Entry point for SOC-start iteration
If GEN.ModeHorEV And SOCnJa Then SOCfirst = True
'Clean up
MODdata.Init()
FCerror = False
'Read cycle
DRI = New cDRI
DRI.FilePath = CurrentCycleFile
If Not DRI.ReadFile Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
'Convert v(s) into v(t) (optional)
If DRI.Scycle Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Converting cycle (v(s) => v(t))", MsgSrc)
If Not DRI.ConvStoT() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
'If first time step is Zero then duplicate first values to start cycle with vehicle standing.
If DRI.Vvorg AndAlso DRI.tDim > 1 AndAlso DRI.Values(tDriComp.V)(0) < 0.0001 AndAlso DRI.Values(tDriComp.V)(1) >= 0.0001 Then
DRI.FirstZero()
End If
'Convert to 1Hz (optional) - does not apply to v(s) cycles because timestep is missing
If DRI.Tvorg Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Converting cycle to 1Hz", MsgSrc)
If Not DRI.ConvTo1Hz() Then
'Error-notification in DRI.Convert()
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
'De-normalize
DRI.DeNorm()
'----------------------------------------------------------------------------
'----------------------------------------------------------------------------
'Initialize Cycle-specs (Speed, Accel, ...)
MODdata.CycleInit()
If GEN.VehMode = tVehMode.EngineOnly Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Engine Only Calc", MsgSrc)
'Rechne .npi-Leistung in Pe und P_clutch um |@@| Expect Npi-Power into Pe and P_clutch
If Not MODdata.Px.Eng_Calc() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
Else
'CAUTION: VehmodeInit() requires information from GEN and DRI!
If Not VEH.VehmodeInit() Then
'Error-notification within VehmodeInit()
JobAbortedByErr = True
GoTo lbNextJob
End If
If Not GBX.GSinit Then
'Error-notification within GSinit()
JobAbortedByErr = True
GoTo lbNextJob
End If
If GBX.TCon Then
If Not GBX.TCinit Then
'Error-notification within TCinit()
JobAbortedByErr = True
GoTo lbNextJob
End If
End If
If GEN.ModeHorEV Then
WorkerMsg(tMsgID.Err, "(H)EV mode is not available!", MsgSrc)
JobAbortedByErr = True
GoTo lbNextJob
Else
If DEV.PreRun Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Driving Cycle Preprocessing", MsgSrc)
If Not MODdata.Px.PreRun Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
If MsgOut Then WorkerMsg(tMsgID.Normal, "Vehicle Calc", MsgSrc)
MODdata.Vh.DistCorrInit()
If Not MODdata.Px.Calc() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
If PHEMworker.CancellationPending Then GoTo lbAbort
'Calculate CycleKin (for erg/sum, etc.)
MODdata.CylceKin.Calc()
End If
'----------------------------------------------------------------------------
'----------------------------------------------------------------------------
'Emissionen und Nachbehandlung - wird bei EV-Modus nicht ausgeführt |@@| Emissions and After-treatment - it will not run in EV mode
If Not GEN.VehMode = tVehMode.EV Then
'If MsgOut Then WorkerMsg(tMsgID.Normal, "Calculating Transient Correction Factors", MsgSrc)
''Determine TC parameters per second
'MODdata.TC.Calc()
'Map creation
If GEN.CreateMap Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Creating Emission Map", MsgSrc)
MAP = New cMAP(GEN.PKWja) 'PKWja ist hier nicht relevant
MAP.FilePath = fFileWoExt(JobFile) & ".v_map"
If Not MAP.CreateMAP() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
MAP.Norm()
End If
If MsgOut Then WorkerMsg(tMsgID.Normal, "FC Interpolation", MsgSrc)
'Calculate Raw emissions
If Not MODdata.Em.Raw_Calc() Then
'If Not DEV.IgnoreFCextrapol Then
' CyclAbrtedByErr = True
' WorkerMsg(tMsgID.Normal, "Calculation aborted!", MsgSrc)
' GoTo lbAusg
'End If
FCerror = True
End If
'TC Parameter umrechnen in Differenz zu Kennfeld-TC-Parameter |@@| Convert TC parameters to differences with Map-TC-parameters
If MAP.TransMap Then MODdata.TC.CalcDiff()
'Dynamic correction
If GEN.dynkorja Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Em Calc: Transient Correction", MsgSrc)
MODdata.Em.TC_Calc()
End If
'Korrektur der Verbrauchswerte kleiner LKW-Motoren bei HBEFA |@@| Correction of consumption values smaller HDV(LKW) engines by HBEFA
If (Not GEN.PKWja) And Cfg.FCcorrection Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Em Calc: FC-Correction", MsgSrc)
FcCorr()
End If
'Exhaust system simulation
If GEN.EXSja Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Em Calc: EXS", MsgSrc)
EXS = New cEXS
If Not EXS.Exs_Main() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
'Totals / Averages form
MODdata.Em.SumCalc()
'Engine Analysis
If GEN.EngAnalysis Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Engine Analysis", MsgSrc)
If Not MODdata.Em.EngAnalysis() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
End If
If PHEMworker.CancellationPending Then GoTo lbAbort
'*** second-by-second output ***
If Cfg.ModOut Then
If MsgOut Then WorkerMsg(tMsgID.Normal, "Writing modal output", MsgSrc)
If Not MODdata.Output() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
WorkerMsg(tMsgID.Normal, "Modal Results written to: " & fFILE(MODdata.ModOutpName & ".vmod", True), MsgSrc, MODdata.ModOutpName & ".vmod")
End If
'VECTO Output
'TODO: Loadings...
If Not GEN.EngOnly Then
If Not VSUM.SetVals(tVSUM.UserDefLoaded) Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
'Output for BATCH and ADVANCE
lbAusg:
'Output in Erg (first Calculation - Initialization & Header)
If Not ERG.AusgERG(NrOfRunStr, fFILE(GenFile, True), fFILE(CurrentCycleFile, True), CyclAbrtedByErr) Then GoTo lbErrInJobLoop
'Data Cleanup
MODdata.CleanUp()
'Status-Update
If PHEMmode = tPHEMmode.ModeSTANDARD Then
WorkerProg(100 * (jgen) / (FilesDim + 1) + 100 * jsubcycle / jsubcyclecount * 1 / (FilesDim + 1), 0)
ElseIf PHEMmode = tPHEMmode.ModeBATCH Then
WorkerProg(100 * (jgen * (CyclesDim + 1) + jzkl + 1) / ((FilesDim + 1) * (CyclesDim + 1)), 0)
End If
'TODO: Loading Loop
'******************** END *** VECTO-loading loop *** END ************************
'**************************************************************************************
If Not GEN.EngOnly Then
If Not VSUM.Output() Then
CyclAbrtedByErr = True
GoTo lbAusg
End If
End If
Next
'************************* END *** VECTO Cycle-loop *** END *************************
'******************************************************************************************
Next
'**********************************************************************************************
'****************************** END *** Cycle-loop *** END ******************************
'**********************************************************************************************
lbNextJob:
If JobAbortedByErr Or (CyclAbrtedByErr And CyclesDim = 0) Then
If JobAbortedByErr Then
If CInt(jgen * (CyclesDim + 1) + 1) = CInt((jgen + 1) * (CyclesDim + 1)) Then
ERG.AusgERG(((jgen + 1) * (CyclesDim + 1)).ToString, fFILE(GenFile, True), "-", True)
Else
ERG.AusgERG((jgen * (CyclesDim + 1) + 1).ToString & ".." & ((jgen + 1) * (CyclesDim + 1)).ToString, fFILE(GenFile, True), "-", True)
End If
End If
WorkerJobStatus(jgen, "Aborted due to error!", tJobStatus.Err)
Else
MsgStrBuilder.Length = 0
MsgStrBuilder.Append("done")
'If GEN.irechwahl = tCalcMode.cmHEV Then MsgStrBuilder.Append(" (dSOC = " & SOC(MODdata.tDim) - SOC(0) & ")")
'Add input file list to signature list
If GEN.CreateFileList Then
For i = 0 To GEN.FileList.Count - 1
Lic.FileSigning.AddFile(GEN.FileList(i))
Next
Else
WorkerMsg(tMsgID.Err, "Could not create file list for signing!", MsgSrc)
End If
If MSGwarn > 0 Then
MsgStrBuilder.Append(". " & MSGwarn & " Warning")
If MSGwarn > 1 Then MsgStrBuilder.Append("s")
End If
If MSGerror > 0 Then
MsgStrBuilder.Append(". " & MSGerror & " Error")
If MSGerror > 1 Then MsgStrBuilder.Append("s")
End If
If MSGerror > 0 Then
WorkerJobStatus(jgen, MsgStrBuilder.ToString & ".", tJobStatus.Warn)
Else
WorkerJobStatus(jgen, MsgStrBuilder.ToString & ".", tJobStatus.OK)
End If
End If
'Check whether Abort
If PHEMworker.CancellationPending Then GoTo lbAbort
Next
'**********************************************************************************************
'******************************* END *** Job loop *** END *******************************
'**********************************************************************************************
WorkerMsg(tMsgID.Normal, "Summary Results written to: " & fFILE(ERG.ErgFile, True), MsgSrc, ERG.ErgFile)
'Write file signatures
WorkerMsg(tMsgID.Normal, "Signing files", MsgSrc)
Lic.FileSigning.Comment = "Created by VECTO"
If Lic.FileSigning.WriteSigFile(SigFile, LicSigAppCode) Then
WorkerMsg(tMsgID.Normal, "Files signed successfully: " & fFILE(SigFile, True), MsgSrc, SigFile)
Else
WorkerMsg(tMsgID.Err, "Failed to sign files! " & Lic.FileSigning.ErrorMsg, MsgSrc)
End If
WorkerMsg(tMsgID.Normal, "done", MsgSrc)
VECTO = tCalcResult.Done
GoTo lbExit
lbErrBefore: '!!!!!!!!!! Abbruch bevor (!!!) der erste Job angefangen wurde !!!!!!!!!!!
WorkerMsg(tMsgID.Normal, "aborted", MsgSrc)
VECTO = tCalcResult.Err
For i = 0 To FilesDim
WorkerJobStatus(i, "", tJobStatus.Undef)
Next
GoTo lbExit
lbErrInJobLoop:
WorkerMsg(tMsgID.Normal, "aborted", MsgSrc)
WorkerJobStatus(jgen, "aborted", tJobStatus.Err)
VECTO = tCalcResult.Err
For i = jgen + 1 To FilesDim
WorkerJobStatus(i, "", tJobStatus.Undef)
Next
MODdata.CleanUp()
GoTo lbExit
lbAbort:
WorkerMsg(tMsgID.Normal, "aborted", MsgSrc)
WorkerJobStatus(jgen, "aborted", tJobStatus.Warn)
VECTO = tCalcResult.Abort
For i = jgen + 1 To FilesDim
WorkerJobStatus(i, "", tJobStatus.Undef)
Next
MODdata.CleanUp()
lbExit:
GEN = Nothing
VEH = Nothing
FLD = Nothing
MAP = Nothing
TRS = Nothing
DRI = Nothing
MODdata = Nothing
ERG = Nothing
ENG = Nothing
GBX = Nothing
End Function
'---------------------------------------------------------------------------
End Module