From d0eb7a8ab5b3aef3c17ed3e75bd2b951123ad674 Mon Sep 17 00:00:00 2001
From: Raphael Luz <luz@ivt.tugraz.at>
Date: Tue, 26 Feb 2013 16:32:32 +0100
Subject: [PATCH] - AT/TC in development. Input parameters in DEV tab.

See VECTO Changelog.txt for more details
---
 User Manual/GUI/VEH-Editor.html |    9 +-
 VECTO Changelog.txt             |   10 +-
 VECTO/ApplicationEvents.vb      |    3 -
 VECTO/GUI/F_MAINForm.vb         |    4 +-
 VECTO/GUI/F_VEH.Designer.vb     |   38 +-
 VECTO/GUI/F_VEH.resx            |   10 +-
 VECTO/Input Files/cGBX.vb       |  175 +++
 VECTO/Input Files/cVEH.vb       |   37 +-
 VECTO/MODcalc/cMOD.vb           |    6 +
 VECTO/MODcalc/cPower.vb         | 2405 ++++---------------------------
 VECTO/M_MAIN.vb                 |   72 +-
 VECTO/VECTO.vbproj.user         |    1 +
 VECTO/VECTO_Global.vb           |    7 +-
 VECTO/cConfig.vb                |   65 +-
 VECTO/cDEV.vb                   |   37 +
 15 files changed, 658 insertions(+), 2221 deletions(-)

diff --git a/User Manual/GUI/VEH-Editor.html b/User Manual/GUI/VEH-Editor.html
index e12d66e6fd..567e0d5a0f 100644
--- a/User Manual/GUI/VEH-Editor.html	
+++ b/User Manual/GUI/VEH-Editor.html	
@@ -114,7 +114,9 @@ Wind Correction</span> (see below).<br>
 / Wheels</span><br>
 <div style="margin-left: 40px;">Rolling Resistance
 Coefficients (RRC) are configured per axle. <span style="font-weight: bold;">Max. axle weight [kg]</span>
-is used to weighten each RRC value. Use the <img style="width: 16px; height: 16px;" alt="add" src="../pics/icons/plus-circle-icon.png"> and <img style="width: 16px; height: 16px;" alt="remove" src="../pics/icons/minus-circle-icon.png"> buttons to add or
+is used to weighten each RRC value. RRC is normalized (Resistance Force
+[N] / (m [kg] * g [m/s�]) with m being the sum of Curb Weight Vehicle,
+Curb Weight Extra Trailer/Body and Loading).<br>Use the <img style="width: 16px; height: 16px;" alt="add" src="../pics/icons/plus-circle-icon.png"> and <img style="width: 16px; height: 16px;" alt="remove" src="../pics/icons/minus-circle-icon.png"> buttons to add or
 remove axles form the vehicle. Doubleclick entries to edit existing
 axle configurations.<br>
 <span style="font-weight: bold;"></span></div>
@@ -186,7 +188,10 @@ with "<span style="font-weight: bold;">c</span> "</span><br>
 &amp; Beta:</span><br>
 <div style="margin-left: 40px;">This
 mode requires an input file which defines the Cd Scaling Factor
-depending on the Yaw Angle ("Beta", angle between vehicle longitudinal axis and direction of air&nbsp;velocity relative to the vehicle). Beta and the air&nbsp;velocity&nbsp;relative to the vehicle must be defined in the driving cycle
+depending on the Yaw Angle ("Beta", angle between vehicle longitudinal
+axis and direction of air&nbsp;velocity relative to the vehicle). Beta
+and the air&nbsp;velocity&nbsp;relative to the vehicle must be defined
+in the driving cycle
 (see below). <span style="color: rgb(51, 102, 255);"><span style="color: black;">The valid range for the Wind Angle
 (Beta)</span></span> goes from 0 (headwind) to 180
 (tailwind). VECTO assumes symmetrical vehicle shape (sign of beta is ignored).<br>
diff --git a/VECTO Changelog.txt b/VECTO Changelog.txt
index 6a5f2d94f3..4465322357 100644
--- a/VECTO Changelog.txt	
+++ b/VECTO Changelog.txt	
@@ -4,8 +4,14 @@ VECTO ?.? (future release)
 - Engine Only Mode
 
 VECTO 1.1 x (current source - next release)
-
-
+- Corrected comment line for wheels inertia and axle config in .vveh file
+- Changed RRC unit in GUI from [-] to [N/N]
+- User Manual updated
+	o Vehicle Editor: RRC
+- Tranmission Loss Maps are not converted to n,Pe-Maps anymore. Should fix non-linear interpolation effects.
+- Automatic Transmission / Torque Converter in development	
+	
+	
 VECTO 1.1 beta - 06.02.2013
 - New independent licensing dll replaces TUG's version
 - Speed values below 0.09km/h are set to 0km/h
diff --git a/VECTO/ApplicationEvents.vb b/VECTO/ApplicationEvents.vb
index 1f299c4225..23a7abeffe 100644
--- a/VECTO/ApplicationEvents.vb
+++ b/VECTO/ApplicationEvents.vb
@@ -20,8 +20,6 @@ Namespace My
             Dim i As Int16
             Dim file As cFile_V3
 
-            FirstTime = False
-
             'Paths
             MyAppPath = My.Application.Info.DirectoryPath & "\"
             MyConfPath = MyAppPath & "config\"
@@ -32,7 +30,6 @@ Namespace My
 
             'If folder does not exist: Create!
             If Not IO.Directory.Exists(MyConfPath) Then
-                FirstTime = True
                 Try
                     IO.Directory.CreateDirectory(MyConfPath)
                 Catch ex As Exception
diff --git a/VECTO/GUI/F_MAINForm.vb b/VECTO/GUI/F_MAINForm.vb
index cdf6b41bc0..5eb4534911 100644
--- a/VECTO/GUI/F_MAINForm.vb
+++ b/VECTO/GUI/F_MAINForm.vb
@@ -572,7 +572,7 @@ Public Class F_MAINForm
         If Command() <> "" Then
             CmdLineCtrl(My.Application.CommandLineArgs)
         Else
-            If FirstTime Then
+            If Cfg.FirstRun Then
                 If MsgBox("Welcome to VECTO!" & vbCrLf & vbCrLf & "Start Quick Start Guide?", MsgBoxStyle.YesNo, "Welcome") = MsgBoxResult.Yes Then
                     If IO.File.Exists(MyAppPath & "User Manual\qsg\quickstartApp.html") Then
                         System.Diagnostics.Process.Start(MyAppPath & "User Manual\qsg\quickstartApp.html")
@@ -583,6 +583,8 @@ Public Class F_MAINForm
             End If
         End If
 
+        Cfg.FirstRun = False
+
     End Sub
 
     'Open file with PHEM
diff --git a/VECTO/GUI/F_VEH.Designer.vb b/VECTO/GUI/F_VEH.Designer.vb
index c569950cdc..960c6c7ed9 100644
--- a/VECTO/GUI/F_VEH.Designer.vb
+++ b/VECTO/GUI/F_VEH.Designer.vb
@@ -55,6 +55,8 @@ Partial Class F_VEH
         Me.ToolStripBtSaveAs = New System.Windows.Forms.ToolStripButton()
         Me.ToolStripSeparator3 = New System.Windows.Forms.ToolStripSeparator()
         Me.ToolStripBtSendTo = New System.Windows.Forms.ToolStripButton()
+        Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator()
+        Me.ToolStripButton1 = New System.Windows.Forms.ToolStripButton()
         Me.GroupBox7 = New System.Windows.Forms.GroupBox()
         Me.PnRt = New System.Windows.Forms.Panel()
         Me.Label45 = New System.Windows.Forms.Label()
@@ -91,8 +93,6 @@ Partial Class F_VEH
         Me.GroupBox1 = New System.Windows.Forms.GroupBox()
         Me.GroupBox4 = New System.Windows.Forms.GroupBox()
         Me.PictureBox1 = New System.Windows.Forms.PictureBox()
-        Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator()
-        Me.ToolStripButton1 = New System.Windows.Forms.ToolStripButton()
         Me.GroupBox6.SuspendLayout()
         Me.ToolStrip1.SuspendLayout()
         Me.GroupBox7.SuspendLayout()
@@ -244,7 +244,7 @@ Partial Class F_VEH
         Me.Label32.AutoSize = True
         Me.Label32.Location = New System.Drawing.Point(206, 184)
         Me.Label32.Name = "Label32"
-        Me.Label32.Size = New System.Drawing.Size(36, 13)
+        Me.Label32.Size = New System.Drawing.Size(43, 13)
         Me.Label32.TabIndex = 24
         Me.Label32.Text = "[kgm²]"
         '
@@ -271,7 +271,7 @@ Partial Class F_VEH
         Me.Label38.AutoSize = True
         Me.Label38.Location = New System.Drawing.Point(235, 48)
         Me.Label38.Name = "Label38"
-        Me.Label38.Size = New System.Drawing.Size(24, 13)
+        Me.Label38.Size = New System.Drawing.Size(31, 13)
         Me.Label38.TabIndex = 24
         Me.Label38.Text = "[m²]"
         '
@@ -390,6 +390,20 @@ Partial Class F_VEH
         Me.ToolStripBtSendTo.Text = "Send to GEN Editor"
         Me.ToolStripBtSendTo.ToolTipText = "Send to GEN Editor"
         '
+        'ToolStripSeparator1
+        '
+        Me.ToolStripSeparator1.Name = "ToolStripSeparator1"
+        Me.ToolStripSeparator1.Size = New System.Drawing.Size(6, 25)
+        '
+        'ToolStripButton1
+        '
+        Me.ToolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
+        Me.ToolStripButton1.Image = Global.VECTO.My.Resources.Resources.Help_icon
+        Me.ToolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta
+        Me.ToolStripButton1.Name = "ToolStripButton1"
+        Me.ToolStripButton1.Size = New System.Drawing.Size(23, 22)
+        Me.ToolStripButton1.Text = "Help"
+        '
         'GroupBox7
         '
         Me.GroupBox7.Controls.Add(Me.PnRt)
@@ -562,7 +576,7 @@ Partial Class F_VEH
         '
         'ColumnHeader9
         '
-        Me.ColumnHeader9.Text = "RRC [-]"
+        Me.ColumnHeader9.Text = "RRC [N/N]"
         Me.ColumnHeader9.Width = 79
         '
         'ButAxlAdd
@@ -749,20 +763,6 @@ Partial Class F_VEH
         Me.PictureBox1.TabIndex = 37
         Me.PictureBox1.TabStop = False
         '
-        'ToolStripSeparator1
-        '
-        Me.ToolStripSeparator1.Name = "ToolStripSeparator1"
-        Me.ToolStripSeparator1.Size = New System.Drawing.Size(6, 25)
-        '
-        'ToolStripButton1
-        '
-        Me.ToolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image
-        Me.ToolStripButton1.Image = Global.VECTO.My.Resources.Resources.Help_icon
-        Me.ToolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta
-        Me.ToolStripButton1.Name = "ToolStripButton1"
-        Me.ToolStripButton1.Size = New System.Drawing.Size(23, 22)
-        Me.ToolStripButton1.Text = "Help"
-        '
         'F_VEH
         '
         Me.AcceptButton = Me.ButOK
diff --git a/VECTO/GUI/F_VEH.resx b/VECTO/GUI/F_VEH.resx
index 075ba615e0..a086c6e101 100644
--- a/VECTO/GUI/F_VEH.resx
+++ b/VECTO/GUI/F_VEH.resx
@@ -112,18 +112,18 @@
     <value>2.0</value>
   </resheader>
   <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="ToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="ToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>32, 17</value>
   </metadata>
-  <metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>142, 21</value>
   </metadata>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
diff --git a/VECTO/Input Files/cGBX.vb b/VECTO/Input Files/cGBX.vb
index 04b64d38bd..411e814b3f 100644
--- a/VECTO/Input Files/cGBX.vb	
+++ b/VECTO/Input Files/cGBX.vb	
@@ -29,6 +29,16 @@ Public Class cGBX
     Public gs_ShiftInside As Boolean
     'Public gs_Type As tGearbox 'not used yet
 
+    'Torque Converter Input
+    Public TCnu As New List(Of Single)
+    Public TCmu As New List(Of Single)
+    Public TCtorque As New List(Of Single)
+    Public TCdim As Integer
+
+    'Torque Converter Iteration Results
+    Public TCMin As Single
+    Public TCnUin As Single
+
 
     Public Sub New()
         Dim i As Short
@@ -185,6 +195,171 @@ Public Class cGBX
 
     End Function
 
+    Public Function TCinit() As Boolean
+        Dim file As New cFile_V3
+        Dim MsgSrc As String
+        Dim line() As String
+
+        MsgSrc = "GBX/TCinit"
+
+        If Not file.OpenRead(DEV.TCfile) Then
+            WorkerMsg(tMsgID.Err, "Torque Converter file not found! (" & DEV.TCfile & ")", MsgSrc)
+            Return False
+        End If
+
+        TCnu.Clear()
+        TCmu.Clear()
+        TCtorque.Clear()
+        TCdim = -1
+
+        Try
+            Do While Not file.EndOfFile
+                line = file.ReadLine
+                TCnu.Add(CSng(line(0)))
+                TCmu.Add(CSng(line(1)))
+                TCtorque.Add(CSng(line(2)))
+                TCdim += 1
+            Loop
+        Catch ex As Exception
+            WorkerMsg(tMsgID.Err, "Error while reading Torque Converter file! (" & ex.Message & ")", MsgSrc)
+            Return False
+        End Try
+
+        file.Close()
+
+        'Check if more then one point
+        If TCdim < 1 Then
+            WorkerMsg(tMsgID.Err, "More points in Torque Converter file needed!", MsgSrc)
+            Return False
+        End If
+
+        Return True
+
+    End Function
+
+    Public Function TCiteration(ByVal nUout As Single, ByVal PeOut As Single) As Boolean
+        Dim nUin As Single
+        Dim Mout As Single
+        Dim VZ As Integer
+        Dim nUstep As Single
+        Dim lastErr As Single
+
+        Dim nu As Single
+        Dim mu As Single
+
+        Dim MoutCalc As Single
+
+        Dim nUmin As Single
+        Dim nUmax As Single
+
+        Dim Schub As Boolean
+
+        'Torque sign
+        If PeOut > 0 Then
+            Schub = False
+        Else
+            Schub = True
+            PeOut *= -1
+        End If
+
+        'Power to torque
+        Mout = nPeToM(nUout, PeOut)
+
+        'rpm-limits
+        nUmin = nnormTonU(GBX.fGSnnDown(Mout))
+        nUmax = nnormTonU(GBX.fGSnnUp(Mout))
+
+        'Start values: Estimate torque converter state
+        nUin = nUout
+
+        If nUin > nUmax Then nUin = nUmax
+        If nUin < nUmin Then nUin = nUmin
+
+        nUstep = DEV.TCnUstep
+        VZ = 1
+        lastErr = 99999
+
+        nu = nUout / nUin
+        mu = fTCmu(nu)
+        MoutCalc = fTCtorque(nu, nUin) * mu
+
+        'Iteration
+        Do While Math.Abs(MoutCalc - Mout) > DEV.TCiterPrec And nUstep > DEV.TCnUstepMin
+            nUin += VZ * nUstep
+            nu = nUout / nUin
+            mu = fTCmu(nu)
+            MoutCalc = fTCtorque(nu, nUin) * mu
+            If Math.Abs(MoutCalc - Mout) > lastErr Then
+                nUstep /= 2
+                VZ *= -1
+            End If
+            lastErr = Math.Abs(MoutCalc - Mout)
+        Loop
+
+        TCMin = MoutCalc / mu
+        TCnUin = nUin
+
+        Return True
+
+    End Function
+
+    Private Function fTCmu(ByVal nu As Single) As Single
+        Dim i As Int32
+
+        'Extrapolation for x < x(1)
+        If TCnu(0) >= nu Then
+            If TCnu(0) > nu Then MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]"
+            i = 1
+            GoTo lbInt
+        End If
+
+        i = 0
+        Do While TCnu(i) < nu And i < TCdim
+            i += 1
+        Loop
+
+        'Extrapolation for x > x(imax)
+        If TCnu(i) < nu Then
+            MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]"
+        End If
+
+lbInt:
+        'Interpolation
+        Return (nu - TCnu(i - 1)) * (TCmu(i) - TCmu(i - 1)) / (TCnu(i) - TCnu(i - 1)) + TCmu(i - 1)
+
+    End Function
+
+    Private Function fTCtorque(ByVal nu As Single, ByVal nUin As Single) As Single
+        Dim i As Int32
+        Dim M0 As Single
+
+        'Extrapolation for x < x(1)
+        If TCnu(0) >= nu Then
+            If TCnu(0) > nu Then MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]"
+            i = 1
+            GoTo lbInt
+        End If
+
+        i = 0
+        Do While TCnu(i) < nu And i < TCdim
+            i += 1
+        Loop
+
+        'Extrapolation for x > x(imax)
+        If TCnu(i) < nu Then
+            MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]"
+        End If
+
+lbInt:
+        'Interpolation
+        M0 = (nu - TCnu(i - 1)) * (TCtorque(i) - TCtorque(i - 1)) / (TCnu(i) - TCnu(i - 1)) + TCtorque(i - 1)
+
+        Return M0 * (nUin / DEV.TCnUref) ^ 2
+
+    End Function
+
+
+
     Public Function GSinit() As Boolean
         Dim file As cFile_V3
         Dim line As String()
diff --git a/VECTO/Input Files/cVEH.vb b/VECTO/Input Files/cVEH.vb
index a69d087c03..49d47b5db7 100644
--- a/VECTO/Input Files/cVEH.vb	
+++ b/VECTO/Input Files/cVEH.vb	
@@ -352,7 +352,7 @@ lbError:
         file.WriteLine(CStr(siAquers))
         'file.WriteLine("c Engine rotational inertia [kg*m^2]")
         'file.WriteLine(CStr(siI_mot))
-        file.WriteLine("c Wheels equivalent rotational inertia [kg] (= I_wheel/rdyn^2)")
+        file.WriteLine("c Wheels inertia [kgm^2]")
         file.WriteLine(CStr(siI_wheels))
         'file.WriteLine("c Gearbox rotational inertia [kg*m^2]")
         'file.WriteLine(CStr(siI_Getriebe))
@@ -416,6 +416,7 @@ lbError:
 
         'Axle configuration - Update 16.10.2012
         file.WriteLine("c Axle configurations")
+        file.WriteLine("c Max. axle weight [kg], RRC [N/N]")
         For Each sl In RRCs
             file.WriteLine(CStr(sl(0)), CStr(sl(1)))
         Next
@@ -550,7 +551,8 @@ lbError:
                     Try
                         'PHEM:    n, PeIn, PeOut => x=n, y=PeOut, z=PeIn |@@| PHEM:    n, PeIn, PeOut => x=n, y=PeOut, z=PeIn
                         'PHEM: GBmap0.AddPoints(CDbl(line(0)) * n_norm, CDbl(line(2)) * Pe_norm, CDbl(line(1)) * Pe_norm) |@@| PHEM: GBmap0.AddPoints(CDbl(line(0)) * n_norm, CDbl(line(2)) * Pe_norm, CDbl(line(1)) * Pe_norm)
-                        'VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn |@@| VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn
+                        'old version: VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn |@@| VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn
+                        'VECTO: n, M_in, M_loss => x=n, y=M_out, z=M_in
                         nU = CDbl(line(0))
                         M_in = CDbl(line(1))
                         M_loss = CDbl(line(2))
@@ -561,7 +563,8 @@ lbError:
                             M_out = M_in + M_loss
                         End If
 
-                        GBmap0.AddPoints(nU, nMtoPe(nU, M_out), nMtoPe(nU, M_in))
+                        'old version: Power instead of torque: GBmap0.AddPoints(nU, nMtoPe(nU, M_out), nMtoPe(nU, M_in))
+                        GBmap0.AddPoints(nU, M_out, M_in)
                     Catch ex As Exception
                         WorkerMsg(tMsgID.Err, "Error during file read! Line number: " & l & " (" & path & ")", MsgSrc)
                         file.Close()
@@ -596,7 +599,7 @@ lbError:
         Dim i As Integer
         Dim Ab As Double
         Dim AbMin As Double
-        Dim iMin As Double
+        Dim iMin As Integer
         Dim PeOutX As Double
 
         Dim MsgSrc As String
@@ -617,25 +620,25 @@ lbError:
 
             Try
                 'Interpolate with Original Values
-                PeIn = GBmap.Intpol(nU, PeOut)
+                PeIn = nMtoPe(nU, GBmap.Intpol(nU, nPeToM(nU, PeOut)))
 
             Catch ex As Exception
 
                 'If error: try extrapolation
 
                 'Search for the nearest Map point
-                AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Y - PeOut) ^ 2) ^ 0.5
+                AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Y - nPeToM(nU, PeOut)) ^ 2) ^ 0.5
                 iMin = 0
                 For i = 1 To GBmap.ptDim
-                    Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Y - PeOut) ^ 2) ^ 0.5
+                    Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Y - nPeToM(nU, PeOut)) ^ 2) ^ 0.5
                     If Ab < AbMin Then
                         AbMin = Ab
                         iMin = i
                     End If
                 Next
 
-                PeOutX = GBmap.ptList(iMin).Y
-                PeIn = GBmap.ptList(iMin).Z
+                PeOutX = nMtoPe(nU, GBmap.ptList(iMin).Y)
+                PeIn = nMtoPe(nU, GBmap.ptList(iMin).Z)
 
                 'Efficiency
                 If PeOutX > 0 Then
@@ -677,7 +680,7 @@ lbError:
                 'Calculate efficiency with PeIn for original PeOut
                 PeIn = PeOut / WG
 
-                MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeOut=" & PToM(nU, PeOut).ToString("0.00") & " [Nm]"
+                MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeOut=" & nPeToM(nU, PeOut).ToString("0.00") & " [Nm]"
 
             End Try
 
@@ -696,7 +699,7 @@ lbError:
         Dim i As Integer
         Dim Ab As Double
         Dim AbMin As Double
-        Dim iMin As Double
+        Dim iMin As Integer
         Dim PeInX As Double
 
         Dim MsgSrc As String
@@ -718,25 +721,25 @@ lbError:
 
             Try
                 'Interpolate with original values
-                PeOut = GBmap.IntpolXZ(nU, PeIn)
+                PeOut = nMtoPe(nU, GBmap.IntpolXZ(nU, nPeToM(nU, PeIn)))
 
             Catch ex As Exception
 
                 'If error: try extrapolation
 
                 'Search for the nearest Map-point
-                AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Z - PeIn) ^ 2) ^ 0.5
+                AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Z - nPeToM(nU, PeIn)) ^ 2) ^ 0.5
                 iMin = 0
                 For i = 1 To GBmap.ptDim
-                    Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Z - PeIn) ^ 2) ^ 0.5
+                    Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Z - nPeToM(nU, PeIn)) ^ 2) ^ 0.5
                     If Ab < AbMin Then
                         AbMin = Ab
                         iMin = i
                     End If
                 Next
 
-                PeInX = GBmap.ptList(iMin).Z
-                PeOut = GBmap.ptList(iMin).Y
+                PeInX = nMtoPe(nU, GBmap.ptList(iMin).Z)
+                PeOut = nMtoPe(nU, GBmap.ptList(iMin).Y)
 
                 'Efficiency
                 If PeOut > 0 Then
@@ -774,7 +777,7 @@ lbError:
                 'Calculate efficiency with PeIn for original PeOut
                 PeOut = PeIn * WG
 
-                MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeIn=" & PToM(nU, PeIn).ToString("0.00") & " [Nm] (fwd)"
+                MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeIn=" & nPeToM(nU, PeIn).ToString("0.00") & " [Nm] (fwd)"
 
             End Try
 
diff --git a/VECTO/MODcalc/cMOD.vb b/VECTO/MODcalc/cMOD.vb
index 49459253f1..4cad84bf8a 100644
--- a/VECTO/MODcalc/cMOD.vb
+++ b/VECTO/MODcalc/cMOD.vb
@@ -726,6 +726,7 @@ Public Class cMOD
         Public RtExtrapol As String
         Public DesMaxExtr As String
         Public GSextrapol As String
+        Public TCextrapol As String
 
         Public Sub New()
             ResetAll()
@@ -754,6 +755,7 @@ Public Class cMOD
             CdExtrapol = ""
             RtExtrapol = ""
             GSextrapol = ""
+            TCextrapol = ""
             PxReset()
         End Sub
 
@@ -804,6 +806,10 @@ Public Class cMOD
                 WorkerMsg(tMsgID.Warn, "Extrapolation in Gear Shift Polygon file (" & GSextrapol & ")!", MsgSrc & "/t= " & Second)
             End If
 
+            If TCextrapol <> "" Then
+                WorkerMsg(tMsgID.Warn, "Extrapolation in Torque Converter file (" & TCextrapol & ")!", MsgSrc & "/t= " & Second)
+            End If
+
             Return Abort
 
         End Function
diff --git a/VECTO/MODcalc/cPower.vb b/VECTO/MODcalc/cPower.vb
index 4c7b36c37e..dc66f75c73 100644
--- a/VECTO/MODcalc/cPower.vb
+++ b/VECTO/MODcalc/cPower.vb
@@ -665,8 +665,8 @@ lbGschw:
                     'Else
                     '    Gear = fGearLKW(jz)
                     'End If
-                    
-                    If fnn(Vist, Gear, False) < Kuppln_norm And Pplus Then
+
+                    If Not DEV.ATmode AndAlso fnn(Vist, Gear, False) < Kuppln_norm And Pplus Then
                         Clutch = tEngClutch.Slipping
                     Else
                         Clutch = tEngClutch.Closed
@@ -678,8 +678,9 @@ lbGschw:
                 End If
 
             Else
+
                 'Check whether Clutch will slip (important for Gear-shifting model):
-                If fnn(Vist, 1, False) < Kuppln_norm And Pplus Then
+                If Not DEV.ATmode AndAlso fnn(Vist, 1, False) < Kuppln_norm And Pplus Then
                     Clutch = tEngClutch.Slipping
                 Else
                     Clutch = tEngClutch.Closed
@@ -715,13 +716,17 @@ lbGschw:
 
                 'Gear shifting-model / gear input can open Clutch
                 If Gear < 1 Then
+
                     Clutch = tEngClutch.Opened
+
                 Else
-                    If fnn(Vist, Gear, False) < Kuppln_norm And Pplus And Not VehState0 = tVehState.Dec Then
+
+                    If Not DEV.ATmode AndAlso fnn(Vist, Gear, False) < Kuppln_norm And Pplus And Not VehState0 = tVehState.Dec Then
                         Clutch = tEngClutch.Slipping
                     Else
                         Clutch = tEngClutch.Closed
                     End If
+
                 End If
 
             End If
@@ -745,10 +750,13 @@ lbCheck:
             ''bICEKupOffen = bKupplOffen <= i need nothing more
 
             'Falls vor Gangwahl festgestellt wurde, dass nicht KupplSchleif, dann bei zu niedriger Drehzahl runterschalten: |@@| If before?(vor) Gear-shift is detected that Clutch does not Lock, then Downshift at too low Revolutions:
-            If Clutch = tEngClutch.Closed Then
-                If fnn(Vist, Gear, False) < Kuppln_norm And Not VehState0 = tVehState.Dec And Gear > 1 Then Gear -= 1
+            If Not DEV.ATmode Then
+                If Clutch = tEngClutch.Closed Then
+                    If fnn(Vist, Gear, False) < Kuppln_norm And Not VehState0 = tVehState.Dec And Gear > 1 Then Gear -= 1
+                End If
             End If
 
+
             'Check whether idling although Power > 0
             '   wenn Leistung vor Diff > 0.1% von Nennleistung dann Korrigieren! |@@| when Power before?(vor) Diff > 0.1% of Nominal-power, then Correct!
             If Clutch = tEngClutch.Opened Then
@@ -760,7 +768,8 @@ lbCheck:
                         Gear = 1
                     End If
 
-                    If fnn(Vist, Gear, False) < Kuppln_norm Then
+
+                    If Not DEV.ATmode AndAlso fnn(Vist, Gear, False) < Kuppln_norm Then
                         Clutch = tEngClutch.Slipping
                     Else
                         Clutch = tEngClutch.Closed
@@ -848,24 +857,42 @@ lbCheck:
 
             Else
 
-                nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
+                If DEV.ATmode And Gear = 1 Then
+
+                    PlossGB = fPlossGB(PvorD, Vist, Gear)
+                    PlossDiff = fPlossDiff(PvorD, Vist)
+                    PlossRt = fPlossRt(Vist, Gear)
+                    PaGetr = fPaG(Vist, aist)
+                    Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt
+
+                    If Not GBX.TCiteration(fnUout(Vist, Gear), Pkup) Then
+                        WorkerMsg(tMsgID.Err, "TC Iteration failed!", MsgSrc & "/t= " & jz + 1)
+                        Return False
+                    End If
+
+                    nn = (GBX.TCnUin - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl)
 
-                '*** Start: Revolutions Check
+                Else
 
-                'Check whether Revolutions too high! => Upshift
-                Do While nn > 1.2 And Gear < VEH.ganganz
-                    Gear += 1
                     nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
-                Loop
 
-                'Check whether Revolutions too low with the Clutch closed
-                If Clutch = tEngClutch.Closed Then
-                    If nn < 0.0001 Then
-                        Gear -= 1
+                    '*** Start: Revolutions Check
+
+                    'Check whether Revolutions too high! => Upshift
+                    Do While nn > 1.2 And Gear < VEH.ganganz
+                        Gear += 1
                         nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
+                    Loop
+
+                    'Check whether Revolutions too low with the Clutch closed
+                    If Clutch = tEngClutch.Closed Then
+                        If nn < 0.0001 Then
+                            Gear -= 1
+                            nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
+                        End If
                     End If
-                End If
 
+                End If
 
             End If
 
@@ -912,13 +939,22 @@ lb_nOK:
                     PlossRt = 0
                     PaGetr = 0
                 Case tEngClutch.Closed
-                    PlossGB = fPlossGB(PvorD, Vist, Gear)
-                    PlossDiff = fPlossDiff(PvorD, Vist)
-                    PlossRt = fPlossRt(Vist, Gear)
-                    PaGetr = fPaG(Vist, aist)
-                    Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt
-                    P = Pkup + Paux + PaMot
-                Case Else 'tEngClutch.Slipping
+
+                    If DEV.ATmode And Gear = 1 Then
+
+                        P = nMtoPe(nU, GBX.TCMin) + Paux + PaMot
+
+                    Else
+
+                        PlossGB = fPlossGB(PvorD, Vist, Gear)
+                        PlossDiff = fPlossDiff(PvorD, Vist)
+                        PlossRt = fPlossRt(Vist, Gear)
+                        PaGetr = fPaG(Vist, aist)
+                        Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt
+                        P = Pkup + Paux + PaMot
+
+                    End If
+                Case Else 'tEngClutch.Slipping: never in AT mode!
                     PlossGB = fPlossGB(PvorD, Vist, Gear)
                     PlossDiff = fPlossDiff(PvorD, Vist)
                     PlossRt = fPlossRt(Vist, Gear)
@@ -1031,2086 +1067,102 @@ lb_nOK:
                         PlossDiff = fPlossDiffFwd(Pkup - PlossGB, Vist)
                         PlossRt = fPlossRt(Vist, Gear)
 
-                        Pbrake = PvorD - (Pkup - PlossGB - PlossDiff - PaGetr - PlossRt)
-
-                        EngState0 = tEngState.FullDrag
-                    Else
-                        Pbrake = 0
-                    End If
-                End If
-            End If
-
-            'Check or Abort (before Speed-reduce-iteration, otherwise it hangs)
-            If PHEMworker.CancellationPending Then Return True
-
-            'Check whether P above Full-load => Reduce Speed
-            If Pplus And P > Pmax Then
-                If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then
-                    If Vist > 0.01 Then
-                        Select Case P / Pmax
-                            Case Is > 1.6
-                                Vh.ReduceSpeed(jz, 0.99)
-                            Case Is > 1.3
-                                Vh.ReduceSpeed(jz, 0.995)
-                            Case Else
-                                Vh.ReduceSpeed(jz, 0.999)
-                        End Select
-                        FirstSecItar = False
-                        GoTo lbGschw
-                    Else
-                        'ERROR: Speed Reduction brings nothing? ...
-                        WorkerMsg(tMsgID.Err, "Speed reduction failed!", MsgSrc & "/t= " & jz + 1)
-                        Return False
-                    End If
-                Else 'tEngState.Idle, tEngState.Stopped, tEngState.Drag
-                    'ERROR:  Engine not in Drivetrain ... can it be?
-                    If FirstSecItar Then
-                        If P > 0.1 Then WorkerMsg(tMsgID.Warn, "Pwheel > 0 but EngState undefined ?!", MsgSrc & "/t= " & jz + 1)
-                    End If
-                End If
-            End If
-
-
-            'Interruption of traction(Zugkraftunterbrechung)
-            If TracIntrI > 0 Then
-
-                If Not TracIntrOn Then
-
-                    If jz > 0 AndAlso Gear > 0 AndAlso MODdata.Gear(jz - 1) > 0 AndAlso Gear <> MODdata.Gear(jz - 1) Then
-
-                        TracIntrGear = Gear
-                        Gear = 0
-                        Clutch = tEngClutch.Opened
-                        TracIntrIx = 0
-                        TracIntrOn = True
-
-                        If TracIntrIx + 1 = TracIntrI Then
-                            ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx)
-                        Else
-                            ZgkrDt = 1
-                        End If
-
-                        Vrollout = fRolloutSpeed(jz, ZgkrDt)
-
-                        If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz, Vrollout)
-
-                        GoTo lbGschw
-
-                    End If
-
-                End If
-
-            End If
-
-            '--------------------------------------------------------------------------------------------------
-            '------------------------- PNR --------------------------------------------------------------------
-            '--------------------------------------------------------------------------------------------------
-            '   Finish Second
-
-            'Start / Stop - Activation-Speed Control
-            If GEN.StartStop Then
-                If StStAus Then
-                    If Not EngState0 = tEngState.Stopped Then
-                        StStTx += 1
-                        If StStTx > GEN.StStT Then
-                            StStTx = 1
-                            StStAus = False
-                        End If
-                    End If
-                Else
-                    If EngState0 = tEngState.Stopped Then StStAus = True
-                End If
-            End If
-
-            'Write Modal-values Fields
-            MODdata.Pe.Add(P / VEH.Pnenn)
-            MODdata.nn.Add(nn)
-            MODdata.nU.Add(nU)
-
-            MODdata.EngState.Add(EngState0)
-
-            MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz)))
-            MODdata.Pluft.Add(fPair(MODdata.Vh.V(jz), jz))
-            MODdata.Proll.Add(fPr(MODdata.Vh.V(jz)))
-            MODdata.Pstg.Add(fPs(MODdata.Vh.V(jz), jz))
-            MODdata.Pbrake.Add(Pbrake)
-            MODdata.Psum.Add(PvorD)
-            MODdata.PauxSum.Add(Paux)
-
-            For Each AuxID As String In VEH.AuxRefs.Keys
-                MODdata.Paux(AuxID).Add(VEH.Paux(AuxID, jz, nU))
-            Next
-
-            MODdata.PlossGB.Add(PlossGB)
-            MODdata.PlossDiff.Add(PlossDiff)
-            MODdata.PlossRt.Add(PlossRt)
-            MODdata.PaEng.Add(PaMot)
-            MODdata.PaGB.Add(PaGetr)
-
-            MODdata.VehState.Add(VehState0)
-            MODdata.Gear.Add(Gear)
-
-            If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0)
-
-            'Interruption of traction(Zugkraftunterbrechung)
-            If TracIntrTurnOff Then
-
-                TracIntrOn = False
-                TracIntrTurnOff = False
-
-            ElseIf TracIntrOn Then
-
-                TracIntrIx += 1
-
-                If TracIntrIx = TracIntrI Then
-
-                    TracIntrTurnOff = True
-
-                ElseIf jz < MODdata.tDim Then
-
-                    If TracIntrIx + 1 = TracIntrI Then
-                        ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx)
-                    Else
-                        ZgkrDt = 1
-                    End If
-
-                    Vrollout = fRolloutSpeed(jz + 1, ZgkrDt)
-                    If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz + 1, Vrollout)
-
-                End If
-
-            End If
-
-            If Vh.Vsoll(jz) - Vist > 1.5 Then SecSpeedRed += 1
-
-
-            LastGearChange = -1
-            For i = jz - 1 To 0 Step -1
-                If MODdata.Gear(i) <> 0 Then
-                    If MODdata.Gear(i) <> Gear Then
-                        LastGearChange = i
-                        Exit For
-                    End If
-                End If
-            Next
-
-
-            LastClutch = Clutch
-
-            'Messages
-            If MODdata.ModErrors.MsgOutputAbort(jz + 1, MsgSrc) Then Return False
-
-            If Clutch = tEngClutch.Closed And Nvorg Then
-                If Math.Abs(nU - fnU(Vist, Gear, False)) > 0.2 * VEH.nNenn Then
-                    WorkerMsg(tMsgID.Warn, "Target rpm =" & nU & ", calculated rpm(gear " & Gear & ")= " & fnU(Vist, Gear, False), MsgSrc & "/t= " & jz + 1)
-                End If
-            End If
-
-
-        Loop Until jz >= MODdata.tDim
-
-        '***********************************************************************************************
-        '***********************************    Time loop END ***********************************
-        '***********************************************************************************************
-
-        'Notify (When not ADVANCE)
-        If NotAdvMode Then
-
-            If Cfg.WegKorJa Then
-                If MODdata.tDim > MODdata.tDimOgl Then WorkerMsg(tMsgID.Normal, "Cycle extended by " & MODdata.tDim - MODdata.tDimOgl & " seconds.", MsgSrc)
-            End If
-
-            If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Normal, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc)
-
-        End If
-
-        'CleanUp
-        Vh = Nothing
-
-        Return True
-
-    End Function
-
-    Public Function Eng_Calc() As Boolean
-
-        Dim Pmr As Single
-        Dim t As Integer
-        Dim t1 As Integer
-        Dim PminN As Single
-        Dim PmaxN As Single
-        Dim nnDRI As List(Of Double)
-        Dim PeDRI As List(Of Double)
-        Dim PcorCount As Integer
-        Dim StdMode As Boolean
-        Dim NotAdvMode As Boolean
-        Dim MsgSrc As String
-
-        MsgSrc = "Power/Eng_Calc"
-
-        StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD)
-        NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE)
-
-        'Abort if Power/Revolutions not given
-        If Not (DRI.Nvorg And DRI.Pvorg) Then
-            WorkerMsg(tMsgID.Err, "Load cycle is not valid! rpm and load required.", MsgSrc)
-            Return False
-        End If
-
-        PcorCount = 0
-        t1 = MODdata.tDim
-        nnDRI = DRI.Values(tDriComp.nn)
-        PeDRI = DRI.Values(tDriComp.Pe)
-
-        'Drehzahlen vorher weil sonst scheitert die Pmr-Berechnung bei MODdata.nU(t + 1) |@@| Revolutions previously, otherwise Pmr-calculation fails at MODdata.nU(t + 1)
-        For t = 0 To t1
-            'Write Modal value Fields
-            '   Allocate MODdata.Pe
-            MODdata.nn.Add(nnDRI(t))
-            MODdata.nU.Add(Math.Max(0, nnDRI(t) * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl))
-        Next
-
-        'Power calculation
-        For t = 0 To t1
-
-            'Secondary Progressbar
-            If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * t / t1)
-
-            'Reset the second-by-second Errors
-            MODdata.ModErrors.ResetAll()
-
-            'OLD and wrong because not time shifted: P_mr(jz) = 0.001 * (I_mot * 0.0109662 * (n(jz) * nnrom) * nnrom * (n(jz) - n(jz - 1))) / Pnrom
-            If t > 0 And t < t1 Then
-                Pmr = 0.001 * (VEH.I_mot * (2 * Math.PI / 60) ^ 2 * MODdata.nU(t) * 0.5 * (MODdata.nU(t + 1) - MODdata.nU(t - 1))) / VEH.Pnenn
-            Else
-                Pmr = 0
-            End If
-
-            'Power of the Cycle corrected by P_clutch
-            MODdata.Pe.Add(PeDRI(t) + Pmr)
-
-            'Revolutions of the Cycle => Determined in Cycle-init
-            'If Revolutions under idle, assume Engine is stopped
-            If MODdata.nn(t) < Cfg.nnormEngStop Then
-                EngState0 = tEngState.Stopped
-            Else
-                PminN = FLD.Pdrag(MODdata.nn(t)) / VEH.Pnenn
-
-                If t = 0 Then
-                    PmaxN = FLD.Pfull(MODdata.nn(t)) / VEH.Pnenn
-                Else
-                    PmaxN = FLD.Pfull(MODdata.nn(t), MODdata.Pe(t - 1)) / VEH.Pnenn
-                End If
-
-                'If Pmax < 0 or Pmin >  0 then Abort with Error!
-                If PminN >= 0 AndAlso MODdata.Pe(t) < 0 Then
-                    WorkerMsg(tMsgID.Err, "Pe_drag > 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1)
-                    Return False
-                ElseIf PmaxN <= 0 AndAlso MODdata.Pe(t) > 0 Then
-                    WorkerMsg(tMsgID.Err, "Pe_full < 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1)
-                    Return False
-                End If
-
-                'FLD Check
-                If MODdata.Pe(t) > PmaxN Then
-                    If MODdata.Pe(t) / PmaxN > 1.05 Then PcorCount += 1
-                    MODdata.Pe(t) = PmaxN
-                ElseIf MODdata.Pe(t) < PminN Then
-                    If MODdata.Pe(t) / PminN > 1.05 Then PcorCount += 1
-                    MODdata.Pe(t) = PminN
-                End If
-
-                Select Case MODdata.Pe(t)
-                    Case Is > 0.0001  'Antrieb
-                        If Math.Abs(MODdata.Pe(t) / PmaxN - 1) < 0.01 Then
-                            EngState0 = tEngState.FullLoad
-                        Else
-                            EngState0 = tEngState.Load
-                        End If
-                    Case Is < -0.0001   'Schlepp
-                        If MODdata.Pe(t) < 1.01 * PminN Then
-                            EngState0 = tEngState.FullDrag
-                        Else
-                            EngState0 = tEngState.Drag
-                        End If
-                    Case Else
-                        EngState0 = tEngState.Idle
-                End Select
-            End If
-
-            MODdata.EngState.Add(EngState0)
-
-            'Notify
-            If MODdata.ModErrors.MsgOutputAbort(t + 1, MsgSrc) Then Return False
-
-        Next
-
-        If PcorCount > 0 Then WorkerMsg(tMsgID.Warn, "Power corrected (>5%) in " & PcorCount & " time steps.", MsgSrc)
-
-        Return True
-
-    End Function
-
-    Public Function EV_Calc() As Boolean
-
-        Dim M As Single
-        Dim nn As Single
-        Dim nU As Single
-        Dim omega_p As Single
-        Dim omega1 As Single, omega2 As Single
-        Dim TzyklOgl As Int32
-        Dim jz As Integer
-        Dim Tzykl As Integer
-
-        'Start/Stop Control
-        Dim StStAus As Boolean
-        Dim StStTx As Single
-
-        Dim Vh As cVh
-
-        Dim Gear As Integer
-        Dim GnachV As Boolean
-        Dim PKWja As Boolean
-
-        Dim P As Single
-        Dim Pkup As Single
-        Dim PaMot As Single
-        Dim PaGetr As Single
-        Dim Paux As Single
-        Dim Pbrake As Single
-        Dim PlossGB As Single
-        Dim PlossDiff As Single
-        Dim PlossRt As Single
-
-        Dim Pmax As Single
-        Dim Pmin As Single
-        Dim PrekupMax As Single
-        Dim PbrakeRek As Single
-
-        Dim PeBat0 As Single
-        Dim PiBat0 As Single
-        Dim PiEM As Single
-
-        Dim GVset As Boolean
-
-        'WegKorrektur |@@| Route-correction
-        Dim WegIst As Single
-        Dim WegX As Integer
-        Dim SecSpeedRed As Integer
-
-        Dim StdMode As Boolean
-        Dim NotAdvMode As Boolean
-        Dim MsgSrc As String
-
-        MsgSrc = "Power/EV_Calc"
-
-        StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD)
-        NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE)
-
-        'Abort if no speed given
-        If Not DRI.Vvorg Then
-            WorkerMsg(tMsgID.Err, "Driving cycle is not valid! Vehicle Speed required.", MsgSrc)
-            Return False
-        End If
-
-        '   Initialize
-        Vh = MODdata.Vh
-        WegIst = 0
-        WegX = 0
-        SecSpeedRed = 0
-
-
-        PeUL = VEH.Pnenn
-
-        If Cfg.GnVorgab Then
-            Gvorg = DRI.Gvorg
-            Nvorg = DRI.Nvorg
-        Else
-            Gvorg = False
-            Nvorg = False
-        End If
-        PKWja = GEN.PKWja
-        StStAus = False
-        StStTx = 0
-
-        If GEN.izykwael = 4 Then
-            Kuppln_norm = 0.05
-            KupplEta = 0.4
-        Else
-            Kuppln_norm = 0.03
-            KupplEta = 1
-        End If
-
-        'Take WG-map from MAP and calculate Pi-list
-        PeL = MAP.LPe
-        nnL = MAP.Lnn
-        Ldim = PeL.Count - 1
-        PiL = New List(Of Single)
-        WGL = New List(Of Single)
-        For jz = 0 To Ldim
-            WGL.Add(MAP.EmDefRef(tMapComp.Eta).RawVals(jz))
-            If PeL(jz) > 0 Then     'Antrieb    => 0 < Pe < Pi
-                PiL.Add(PeL(jz) / WGL(jz))
-            ElseIf PeL(jz) < 0 Then 'Laden      => 0 > Pi > Pe
-                PiL.Add(PeL(jz) * WGL(jz))
-            Else
-                PiL.Add(0)
-            End If
-        Next
-
-        'Gear-shifting points for NEDC/FTP
-        Select Case GEN.izykwael
-            Case 0  'Nefzja = True
-                GnachV = True
-            Case 1  'Ftpja = True 
-                GnachV = True
-            Case Else
-                GnachV = False
-                Aaufi = 0.3
-                Baufi = 0.3
-                Caufi = 0.4
-                Aobi = 0.18
-                Bobi = 0.28
-                Cobi = 0.46
-        End Select
-
-
-        'Theoretical Maximum-speed [m/s]
-        GVmax = VEH.nNenn * VEH.Dreifen * Math.PI / (VEH.AchsI * VEH.Igetr(VEH.ganganz) * 60)
-
-        jz = -1
-        Tzykl = MODdata.tDim
-        TzyklOgl = Tzykl
-
-        '***********************************************************************************************
-        '***********************************    Time-loop ****************************************
-        '***********************************************************************************************
-
-        Do
-            jz += 1
-
-            GVset = False
-
-            'Secondary Progressbar
-            If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * jz / MODdata.tDim)
-
-            '   Determine State
-
-lbGschw:
-
-            'Calculate Speed/Acceleration -------------------
-            'Now by DRI-class
-            Vist = Vh.V(jz)
-            aist = Vh.a(jz)
-
-            'If Speed over the theoretical Top-Speed => Reduce
-            If Vist > GVmax + 0.0001 And Not GVset Then
-                Vh.SetSpeed0(jz, GVmax)
-                GVset = True
-                GoTo lbGschw
-            End If
-
-            'From Power -----
-            If aist < 0 Then
-                If (Vist < 0.025) Then
-                    Vist = 0
-                End If
-            End If
-            '---------------
-
-            PbrakeRek = 0
-
-            'Determine Driving-state -------------------------
-            Pplus = False
-            Pminus = False
-
-            If Vist < 0.0001 Then
-                VehState0 = tVehState.Stopped
-            Else
-                If aist >= 0.01 Then
-                    VehState0 = tVehState.Acc
-                ElseIf aist < -0.01 Then
-                    VehState0 = tVehState.Dec
-                Else
-                    VehState0 = tVehState.Cruise
-                End If
-            End If
-
-            PvorD = fPvD(jz)
-
-            Select Case PvorD
-                Case Is > 0.0001
-                    Pplus = True
-                Case Is < -0.0001
-                    Pminus = True
-            End Select
-
-            'Maximum allowable Battery-power
-            BAT.Bat_Pzul(jz)
-            PeBatMax = BAT.PmaxAntr
-            PeBatMin = BAT.PmaxLaden
-
-            '************************************ Gear selection ************************************
-            If VehState0 = tVehState.Stopped Then
-                Gear = 0
-                Clutch = tEngClutch.Opened
-            Else
-                'Check whether Clutch-lock (important for Gear-shifting model):
-                If fnn(Vist, 1, False) < Kuppln_norm And Pplus Then
-                    Clutch = tEngClutch.Slipping
-                Else
-                    Clutch = tEngClutch.Closed
-                End If
-
-                If Gvorg Then
-                    'Gear-setting
-                    Gear = Math.Min(Vh.GearVorg(jz), VEH.ganganz)
-                ElseIf Nvorg Then
-                    'Revolutions-setting
-                    Gear = fGearByU(MODdata.nUvorg(jz), Vist)
-                ElseIf VEH.ganganz = 1 Then
-                    Gear = 1
-                Else
-                    If GnachV Then
-                        'Gear from Speed is not supported here
-                        WorkerMsg(tMsgID.Err, "Geary-By-Speed not supported in EV mode!", MsgSrc)
-                        Return False
-                    Else
-                        'Gear-shifting Model
-                        Gear = fGearEV(jz)
-
-                        'EV: No idle due to recuperation
-                        If Gear = 0 Then Gear = 1
-                    End If
-                End If
-            End If
-
-            If Gear = -1 Then
-                WorkerMsg(tMsgID.Err, "Error in Gear Shift Model!", MsgSrc & "/t= " & jz + 1)
-                Return False
-            End If
-
-            If Gear < 1 Then Clutch = tEngClutch.Opened
-
-            'If regenerative braking is possible according to Wheel-power: Calculate PrekupMax
-            If Pminus And Clutch = tEngClutch.Closed Then
-                'Calculate Maximum Recuperation-power (depending on Wheel-load/Friction-coefficient)
-                PrekupMax = fPrekupMax()
-                If PrekupMax > -0.000001 Then Clutch = tEngClutch.Opened
-            End If
-
-            'Falls vor Gangwahl festgestellt wurde, dass nicht KupplSchleif, dann bei zu niedriger Drehzahl runterschalten: |@@| If before Gear-selection it Clutch was not Locked, then Shift-down at too low a Revolutions:
-            If Clutch = tEngClutch.Closed Then
-                If fnn(Vist, Gear, False) < Kuppln_norm And Not VehState0 = tVehState.Dec And Gear > 1 Then Gear -= 1
-            End If
-
-            'Check whether Idling although Power > 0
-            '   When Power before Diff > 0.1% of Nominal-power then Correct!
-            If Clutch = tEngClutch.Opened Then
-                If PvorD > 0.001 * VEH.Pnenn Then
-                    Gear = 1
-                    If fnn(Vist, Gear, False) < Kuppln_norm Then
-                        Clutch = tEngClutch.Slipping
-                    Else
-                        Clutch = tEngClutch.Closed
-                    End If
-                End If
-            End If
-
-            '************************************ Revolutions ************************************
-
-            '*** If the Revolutions is specified (Gemess = 2) then the next block is skipped ***
-            If Nvorg Then
-                nn = (MODdata.nUvorg(jz) - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl)
-                GoTo lb_nOK
-            End If
-
-lb10:
-
-            'Revolutions drop when decoupling
-            If Clutch = tEngClutch.Opened Then
-                If jz = 0 Then
-                    nn = 0
-                Else
-                    nn = MODdata.nn(jz - 1)
-                    If nn <= 0.00001 Then GoTo lb_nOK
-                    Pmin = FLD.Pdrag(nn)
-                    nU = nn * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl
-                    omega1 = nU * 2 * Math.PI / 60
-                    M = -Pmin * 1000 * 60 / (2 * Math.PI * nU)
-                    omega_p = M / VEH.I_mot
-                    omega2 = omega1 - omega_p
-                    nU = Math.Max(VEH.nLeerl, omega2 * 60 / (2 * Math.PI))
-                    nn = (nU - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl)
-                End If
-
-            Else
-
-                nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
-
-                '*** Start: Revolutions-Check if not specified
-
-                'Check whether Revolutions too high! => Upshift
-                Do While nn > 1 And Gear < VEH.ganganz
-                    Gear += 1
-                    nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
-                Loop
-
-                'Check whether Revolutions too low with the Clutch-closed
-                If Clutch = tEngClutch.Closed Then
-                    If nn < 0.001 Then
-                        Gear = 0
-                        Clutch = tEngClutch.Opened
-                    End If
-                End If
-
-            End If
-
-
-lb_nOK:
-            '************************************ Determine Engine-state ************************************
-            ' nn fix is here!
-            nU = nn * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl
-
-            'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next Consumption (from VEH and DRI)
-            Paux = fPaux(jz, nU)
-
-            'Engine-inertia
-            If Clutch = tEngClutch.Opened Then
-                If jz = 0 Then
-                    PaMot = 0
-                Else
-                    'Not optimal since jz-1 to jz not the right Interval
-                    PaMot = (VEH.I_mot * (nU - MODdata.nU(jz - 1)) * 0.01096 * (nU + MODdata.nU(jz - 1) / 2)) * 0.001
-                End If
-            Else
-                If Nvorg Then
-                    'Revolutions-setting
-                    PaMot = (VEH.I_mot * MODdata.dnUvorg(jz) * 0.01096 * MODdata.nUvorg(jz)) * 0.001
-                Else
-                    PaMot = ((VEH.I_mot * (VEH.AchsI * VEH.Igetr(Gear) / (0.5 * VEH.Dreifen)) ^ 2) * aist * Vist) * 0.001
-                End If
-            End If
-
-            'Total Engine-power
-            '   => Pantr
-            '   => P
-            '   => Pkup
-            Select Case Clutch
-                Case tEngClutch.Opened
-                    P = PaMot
-                    Pkup = 0
-                    PlossGB = 0
-                    PlossDiff = 0
-                    PlossRt = 0
-                    PaGetr = 0
-                Case tEngClutch.Closed
-                    PlossGB = fPlossGB(PvorD, Vist, Gear)
-                    PlossDiff = fPlossDiff(PvorD, Vist)
-                    PlossRt = fPlossRt(Vist, Gear)
-                    PaGetr = fPaG(Vist, aist)
-                    Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt
-                    P = Pkup + PaMot
-                Case tEngClutch.Slipping
-                    PlossGB = fPlossGB(PvorD, Vist, Gear)
-                    PlossDiff = fPlossDiff(PvorD, Vist)
-                    PlossRt = fPlossRt(Vist, Gear)
-                    PaGetr = fPaG(Vist, aist)
-                    Pkup = (PvorD + PlossGB + PlossDiff + PaGetr + PlossRt) / KupplEta
-                    P = Pkup + PaMot
-            End Select
-
-            'EngState      
-            Select Case P
-                Case Is > 0.0001    'Antrieb
-                    EngState0 = tEngState.Load
-
-                Case Is < -0.0001   'Rekuperieren
-                    EngState0 = tEngState.Drag
-
-                Case Else           'Idle/Stop
-                    EngState0 = tEngState.Stopped
-            End Select
-
-
-            '*************** Power distribution, etc. ******************
-
-            'Full-load/Drag-curve
-            If EngState0 = tEngState.Stopped Then
-                Pmin = 0
-                Pmax = 0
-                PeBatMax = 0
-                PeBatMax = 0
-                nU = 0
-                nn = (nU - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl)
-            Else
-                Pmax = fPeEMmax(nn)
-                Pmin = fPeEMmin(nn)
-            End If
-
-            '   => Pbrake
-            Select Case EngState0
-                Case tEngState.Load
-                    Pbrake = 0
-                    If Math.Abs(P / Pmax - 1) < 0.02 Then EngState0 = tEngState.FullLoad
-                Case tEngState.Drag
-
-                    'Calculate Maximum Recuperation power (depending on Wheel-load/Friction-coefficient)
-                    'PrekupMax = fPrekupMax()
-
-                    'If RecupMax exceeded, then must recalculate Pe
-                    If PrekupMax > PvorD And Clutch = tEngClutch.Closed Then
-
-                        'PbrakeRek = power which must be additionally hampered mechanical overrun of RekupMax
-                        'wird schon oben nach Gangwahl erledigt: PbrakeRek = Pantr - PrekupMax |@@| is already done by top gear selection: PbrakeRek = Pantr - PrekupMax
-
-                        'New EM-Power
-                        P = PrekupMax + fPlossGB(PrekupMax, Vist, Gear) + fPlossDiff(PrekupMax, Vist) + fPaG(Vist, aist) + PaMot
-
-                    End If
-
-                    'Check ob Leistung aufgenommen werden kann (abh. von FLD und Batterie). Bremsleistung berechnen. |@@| Check whether power can be added (depending on battery and FLD). Compute Braking Power.
-                    If P < Pmin Then
-                        Pbrake = P - Pmin
-                        P = Pmin
-                        EngState0 = tEngState.FullDrag
-                    Else
-                        Pbrake = 0
-                    End If
-
-                    'Addup RekupMax-Braking-power
-                    Pbrake += PbrakeRek
-
-                Case Else 'tEngState.Idle, tEngState.Stopped
-                    If PvorD < -0.00001 Then
-                        Pbrake = PvorD
-                    Else
-                        Pbrake = 0
-                    End If
-
-            End Select
-
-            'Check whether above Full-load => Speed-reduction
-            If Pplus And P > Pmax Then
-                If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then
-
-                    'When Pmax = 0 then Battery must be empty
-                    If Pmax < 0.0001 Then GoTo lbBatLeer
-
-                    If Vist > 0.01 Then
-                        Select Case P / Pmax
-                            Case Is > 1.6
-                                Vh.ReduceSpeed(jz, 0.99)
-                            Case Is > 1.3
-                                Vh.ReduceSpeed(jz, 0.995)
-                            Case Else
-                                Vh.ReduceSpeed(jz, 0.999)
-                        End Select
-                        GoTo lbGschw
-                    Else
-                        'ERROR: Velocity reduction brings nothing? ...
-                        WorkerMsg(tMsgID.Err, "P > Pmax ?!", MsgSrc)
-                        Return False
-                    End If
-                End If
-            End If
-
-            '-------------------------------------------------------
-            '------------------------- PNR -------------------------
-            '-------------------------------------------------------
-            '   Finish Second
-
-            If PHEMworker.CancellationPending Then Return True
-
-            '**************************************************
-            '******************** EM **************************
-            If P = 0 Then
-                PiEM = 0
-            Else
-                PiEM = fPifromPe(nn, P)
-            End If
-
-            '**************************************************
-            '***************** Battery ***********************
-            If EngState0 = tEngState.Stopped Or P = 0 Then
-                PeBat0 = Paux
-            Else
-                PeBat0 = fPifromPe(nn, P) + Paux
-            End If
-
-            BAT.Bat_Calc(PeBat0, jz)
-
-            PiBat0 = PeBat0 + BAT.PbatV
-
-            '*************************************************
-            '****** Write Modal-value Fields **************
-            MODdata.Pe.Add(P / VEH.Pnenn)
-            MODdata.nn.Add(nn)
-            MODdata.nU.Add(nU)
-            MODdata.EngState.Add(EngState0)
-            MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz)))
-            MODdata.Pluft.Add(fPair(MODdata.Vh.V(jz), jz))
-            MODdata.Proll.Add(fPr(MODdata.Vh.V(jz)))
-            MODdata.Pstg.Add(fPs(MODdata.Vh.V(jz), jz))
-            MODdata.Pbrake.Add(Pbrake)
-            MODdata.Psum.Add(PvorD)
-            MODdata.PauxSum.Add(Paux)
-
-            For Each AuxID As String In VEH.AuxRefs.Keys
-                MODdata.Paux(AuxID).Add(VEH.Paux(AuxID, jz, nU))
-            Next
-
-            MODdata.PlossGB.Add(PlossGB)
-            MODdata.PlossDiff.Add(PlossDiff)
-            MODdata.PlossRt.Add(PlossRt)
-            MODdata.PaEng.Add(PaMot)
-            MODdata.PaGB.Add(PaGetr)
-
-            MODdata.VehState.Add(VehState0)
-            MODdata.Gear.Add(Gear)
-
-            PeEMot.Add(P)
-            PiEMot.Add(PiEM)
-            PeBat.Add(PeBat0)
-            PiBat.Add(PiBat0)
-            Ubat.Add(BAT.Ubat)
-            Ibat.Add(BAT.Ibat)
-            SOC.Add(BAT.SOC)
-            TempBat.Add(BAT.TempBat)
-
-            If SOC(jz) <= BAT.SOC_MIN Then GoTo lbBatLeer
-
-            If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0)
-
-
-            If Vh.Vsoll(jz) - Vist > 1.5 Then SecSpeedRed += 1
-
-            'Notify
-            If MODdata.ModErrors.MsgOutputAbort(jz + 1, MsgSrc) Then Return False
-
-        Loop Until jz >= Tzykl
-
-        '***********************************************************************************************
-        '*********************************    Time loop END *************************************
-        '***********************************************************************************************
-
-
-        'Notify (not ADV)
-        If NotAdvMode Then
-
-            If Cfg.WegKorJa Then
-                If MODdata.tDim > TzyklOgl Then WorkerMsg(tMsgID.Warn, "Cycle extended by " & MODdata.tDim - TzyklOgl & " seconds.", MsgSrc)
-            End If
-
-            If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Warn, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc)
-
-        End If
-
-
-        GoTo lbDone
-
-
-
-lbBatLeer:
-
-        'TODO Error message etc
-        MODdata.tDim = jz - 1
-        WorkerMsg(tMsgID.Warn, "SOC-Min reached! Calculation aborted!", MsgSrc)
-
-lbDone:
-
-        'CleanUp
-        Vh = Nothing
-        PeL = Nothing
-        PiL = Nothing
-        nnL = Nothing
-        WGL = Nothing
-
-        Return True
-
-    End Function
-
-    Public Function HEV_Calc() As Boolean
-
-        Dim M As Single
-        Dim nn As Single
-        Dim nU As Single
-        Dim omega_p As Single
-        Dim omega1 As Single, omega2 As Single
-        Dim TzyklOgl As Int32
-        Dim jz As Integer
-
-        Dim Vh As cVh
-
-        Dim Gear As Integer
-        Dim GnachV As Boolean
-        Dim PKWja As Boolean
-
-        Dim P As Single
-        Dim Pkup As Single
-        Dim PaGetr As Single
-        Dim ICEmin As Single
-        Dim ICEmax As Single
-        Dim Paux As Single
-        Dim Pbrake As Single
-        Dim PlossGB As Single
-        Dim PlossDiff As Single
-        Dim PlossRt As Single
-
-        Dim GVset As Boolean
-
-        'Route(Weg) correction
-        Dim WegIst As Single
-        Dim WegX As Integer
-
-        Dim SecSpeedRed As Integer
-
-        Dim nU0 As Single
-
-        'HEV
-        Dim SOC0 As Single
-        Dim SOCo As Single
-        Dim SOCu As Single
-        Dim EMmin As Single
-        Dim EMmax As Single
-
-        Dim BatLvl As tBatLvl
-        Dim ICElock As tICElock
-        Dim LockCount As Integer
-
-        Dim PaICE As Single
-        Dim PaEM As Single
-
-        Dim PeEV As Single
-        Dim PeICEonly As Single
-        Dim PeKomb As Single
-
-        Dim FirstSec As Boolean
-
-        Dim LastHEVmode As tHEVparMode
-        Dim LastHEVnotPossible As Boolean
-        Dim LastEngState As tEngState
-        Dim LastPeICE As Single
-        Dim StateChange As Boolean
-
-        Dim ModeCheck As Dictionary(Of tHEVparMode, Boolean)
-        Dim EVcrit As Boolean
-        Dim HEVmode0 As tHEVparMode
-        Dim HEVmodeByKe As tHEVparMode
-        Dim NeedBoost As Boolean
-        Dim Under_vEVu As Boolean
-        Dim Under_vEVo As Boolean
-
-        Dim KeA As Single
-        Dim KeG As Single
-        Dim KeSTE As Single
-        Dim KeFail As Boolean
-        Dim DeltaG As Single
-        Dim DeltaA As Single
-
-        Dim Pel As Single
-        Dim PelStep As Single = 0.5
-        Dim FCbasis As Single
-        Dim Pvkm As Single
-        Dim PvkmAlt As Single
-        Dim KeAmin As Single
-        Dim KeGmax As Single
-        Dim PelOpt As Single
-        Dim FCminus As Single
-        Dim FCplus As Single
-        Dim Pmot As Single
-        Dim Pbat As Single
-        Dim PeKeAoptEM As Single
-        Dim PeKeGoptEM As Single
-        Dim PeKeAoptICE As Single
-        Dim PeKeGoptICE As Single
-        Dim bAbort As Boolean
-
-        Dim PeBat0 As Single
-        Dim PiBat0 As Single
-
-        Dim PeICE As Single
-        Dim nnICE As Single
-        Dim nUICE As Single
-
-        Dim PeEM As Single
-        Dim PiEM As Single
-        Dim nUEM As Single
-
-        Dim PrekupMax As Single
-
-        Dim ICEclutch As Boolean
-        Dim EMclutch As Boolean
-
-        Dim StdMode As Boolean
-        Dim NotAdvMode As Boolean
-        Dim MsgSrc As String
-
-        MsgSrc = "Power/HEV_Calc"
-
-        StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD)
-        NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE)
-
-
-        ModeCheck = New Dictionary(Of tHEVparMode, Boolean)
-        ModeCheck.Add(tHEVparMode.Assist, False)
-        ModeCheck.Add(tHEVparMode.LPI, False)
-        ModeCheck.Add(tHEVparMode.EV, False)
-        ModeCheck.Add(tHEVparMode.ICEonly, False)
-        ModeCheck.Add(tHEVparMode.Rekup, False)
-
-        'Abort when no speed given
-        If Not DRI.Vvorg Then
-            WorkerMsg(tMsgID.Err, "Driving cycle is not valid! Vehicle Speed required.", MsgSrc)
-            Return False
-        End If
-
-        '   Initialize
-        Vh = MODdata.Vh
-        If Cfg.GnVorgab Then
-            Gvorg = DRI.Gvorg
-            Nvorg = DRI.Nvorg
-        Else
-            Gvorg = False
-            Nvorg = False
-        End If
-        PKWja = GEN.PKWja
-        LockCount = 0
-        WegIst = 0
-        WegX = 0
-        SecSpeedRed = 0
-
-        If GEN.izykwael = 4 Then
-            Kuppln_norm = 0.05
-            KupplEta = 0.4
-        Else
-            Kuppln_norm = 0.03
-            KupplEta = 1
-        End If
-
-        'Gear-shifting points for NEDC/FTP
-        Select Case GEN.izykwael
-            Case 0  'Nefzja = True
-                GnachV = True
-                avh(1) = 16 / 3.6
-                avh(2) = 34.0 / 3.6
-                avh(3) = 51 / 3.6
-                avh(4) = 69 / 3.6
-                If (VEH.ganganz = 5) Then
-                    avh(5) = 180 / 3.6
-                Else
-                    avh(5) = 99 / 3.6
-                    avh(6) = 180 / 3.6
-                End If
-                avl(1) = -5.0 / 3.6
-                avl(2) = 0.1 / 3.6
-                avl(3) = 34.0 / 3.6
-                avl(4) = 34.0 / 3.6
-                avl(5) = 60.0 / 3.6
-                avl(6) = 60.0 / 3.6
-            Case 1  'Ftpja = True 
-                GnachV = True
-                avh(1) = 25 / 3.6
-                avh(2) = 40 / 3.6
-                avh(3) = 65 / 3.6
-                avh(4) = 74 / 3.6
-                avh(5) = 200 / 3.6
-                avl(1) = 12.9 / 3.6
-                avl(2) = 13.0 / 3.6
-                avl(3) = 28 / 3.6
-                avl(4) = 52 / 3.6
-                avl(5) = 60 / 3.6
-                avl(6) = 200 / 3.6
-            Case Else
-                GnachV = False
-                'Gear-shifting parameters initialization
-                Aaufi = 0.3
-                Baufi = 0.3
-                Caufi = 0.4
-                Aobi = 0.18
-                Bobi = 0.28
-                Cobi = 0.46
-        End Select
-
-        'Theoretical maximum speed [m/s]
-        GVmax = VEH.nNenn * VEH.Dreifen * Math.PI / (VEH.AchsI * VEH.Igetr(VEH.ganganz) * 60)
-
-        'HEV
-        SOC0 = BAT.SOC
-        FirstSec = True
-        StateChange = True
-        ICElock = tICElock.NoLock
-        LockCount = 0
-        LastPeICE = 0
-        LastHEVmode = tHEVparMode.Undefined
-        LastHEVnotPossible = True
-        LastEngState = tEngState.Idle
-        BatLvl = tBatLvl.OK
-        Under_vEVu = False
-        Under_vEVo = False
-
-        jz = -1
-        TzyklOgl = MODdata.tDim
-
-        '***********************************************************************************************
-        '***********************************    Time-loop ****************************************
-        '***********************************************************************************************
-
-        Do
-            jz += 1
-            GVset = False
-
-            'Secondary Progressbar
-            If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * jz / MODdata.tDim)
-
-            '   Determine State
-
-lbGschw:
-
-            'Speed / Acceleration calculation -------------------
-            'Now by DRI-class
-            Vist = Vh.V(jz)
-            aist = Vh.a(jz)
-
-            'If Speed over Theoretical-top-speed => Reduce
-            If Vist > GVmax + 0.0001 And Not GVset Then
-                Vh.SetSpeed0(jz, GVmax)
-                GVset = True
-                GoTo lbGschw
-            End If
-
-            'From Power -----
-            If aist < 0 Then
-                If (Vist < 0.025) Then
-                    'Vh.SetSpeed(jz, 0)
-                    'GoTo lbGschw
-                    Vist = 0
-                End If
-            End If
-            '---------------
-
-            '*******************************************************************************
-            '*************************** Determine Driving-state *****************************
-
-            'Determine Driving-state-------------------------
-            Pplus = False
-            Pminus = False
-
-            If Vist < 0.0001 Then
-                VehState0 = tVehState.Stopped
-            Else
-                If aist >= 0.1 Then
-                    VehState0 = tVehState.Acc
-                ElseIf aist < -0.1 Then
-                    VehState0 = tVehState.Dec
-                Else
-                    VehState0 = tVehState.Cruise
-                End If
-            End If
-
-
-            '*******************************************************************************
-            '************************************* HEV *************************************
-            Select Case BatLvl
-                Case tBatLvl.Full, tBatLvl.High
-                    SOCo = 0.95 * HEV.SOC_OW
-                    SOCu = 0.95 * HEV.SOC_UW
-                Case tBatLvl.Empty, tBatLvl.Low
-                    SOCo = 1.05 * HEV.SOC_OW
-                    SOCu = 1.05 * HEV.SOC_UW
-                Case Else
-                    SOCo = 1.05 * HEV.SOC_OW
-                    SOCu = 0.95 * HEV.SOC_UW
-            End Select
-
-            Select Case SOC0
-                Case Is >= BAT.SOC_MAX
-                    BatLvl = tBatLvl.Full
-                Case Is > SOCo
-                    BatLvl = tBatLvl.High
-                Case Is > SOCu
-                    BatLvl = tBatLvl.OK
-                Case Is > BAT.SOC_MIN
-                    BatLvl = tBatLvl.Low
-                Case Else
-                    BatLvl = tBatLvl.Empty
-            End Select
-
-            ModeCheck(tHEVparMode.Assist) = False
-            ModeCheck(tHEVparMode.LPI) = False
-            ModeCheck(tHEVparMode.EV) = False
-            ModeCheck(tHEVparMode.ICEonly) = False
-            ModeCheck(tHEVparMode.Rekup) = False
-            NeedBoost = False
-            HEVmode0 = tHEVparMode.Undefined
-            ICEclutch = False
-            EMclutch = False
-            PeICE = 0
-            PeEM = 0
-            EVcrit = False
-            KeFail = False
-
-            If Under_vEVu Then
-                If Vist >= 1.05 * HEV.vEVu Then Under_vEVu = False 'Größer-Gleich damit bei vEVu = 0 immer Under_vEVu = False
-            Else
-                If Vist < 0.95 * HEV.vEVu Then Under_vEVu = True
-            End If
-
-            If Under_vEVo Then
-                If Vist >= 1.05 * HEV.vEVo Then Under_vEVo = False 'Größer-Gleich damit bei vEVo = 0 immer Under_vEVu = False
-            Else
-                If Vist < 0.95 * HEV.vEVo Then Under_vEVo = True
-            End If
-
-            If Not FirstSec Then StateChange = (VehState0 <> MODdata.VehState(jz - 1))
-
-            '********************* PvorD = PanRad ************************
-
-            PvorD = fPvD(jz)
-
-            Select Case PvorD
-                Case Is > 0.0001
-                    Pplus = True
-                Case Is < -0.0001
-                    Pminus = True
-            End Select
-
-            '************************************ Gear selection ************************************
-            If VehState0 = tVehState.Stopped Then
-                Gear = 0
-                Clutch = tEngClutch.Opened
-            Else
-                'Check whether Clutch Locks (important for Gear-shifting model):
-                If fnn(Vist, 1, False) < Kuppln_norm And Pplus Then
-                    Clutch = tEngClutch.Slipping
-                Else
-                    Clutch = tEngClutch.Closed
-                End If
-
-                If Gvorg Then
-                    'Gear-settings
-                    Gear = Math.Min(Vh.GearVorg(jz), VEH.ganganz)
-                ElseIf Nvorg Then
-                    'Revolutions-setting
-                    Gear = fGearByU(MODdata.nUvorg(jz), Vist)
-                ElseIf VEH.ganganz = 1 Then
-                    Gear = 1
-                Else
-                    If GnachV Then
-                        'Gear from Speed
-                        Gear = fGearBySpeed(jz)
-                    Else
-                        'Gear-shifting Model
-                        If PKWja Then
-                            Gear = fGearPKW(jz)
-                        Else
-                            Gear = fGearLKW(jz)
-                        End If
-                    End If
-                End If
-            End If
-
-            If Gear = -1 Then
-                WorkerMsg(tMsgID.Err, "Error in Gear Shift Model!", MsgSrc & "/t= " & jz + 1)
-                Return False
-            End If
-
-            'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next Consumption (from VEH and DRI)
-            Paux = fPaux(jz, 0)
-
-            'HEV-Teil kommt erst nach Gangwahl weil Getr./Diff-Loss den benötigt und EM zwischen ICE und GB liegt |@@| HEV-part comes after Gear-selection because Transmission/Diff-loss and requires the EM is between ICE and GB
-            If VehState0 = tVehState.Stopped Then
-
-                PeICE = 0
-                PeEM = 0
-                ICEclutch = False
-                EMclutch = False
-
-                'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next consumption (from VEH and DRI)
-                Paux = fPaux(jz, 0)
-
-            Else
-
-                If Nvorg Then
-                    'If Revolutions specified
-                    nU = MODdata.nUvorg(jz)
-                Else
-                    'Otherwise from Vist and Gear
-                    nU = fnU(Vist, Gear, Clutch = tEngClutch.Slipping)
-                End If
-
-                'Normalized Revolutions
-                nn = (nU - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl)
-
-                'Maximum power of the ICE
-                If jz = 0 Then
-                    ICEmax = FLD.Pfull(nn)
-                Else
-                    ICEmax = FLD.Pfull(nn, MODdata.Pe(jz - 1))
-                End If
-
-                ICEmin = FLD.Pdrag(nn)
-
-                'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next consumption (from VEH and DRI)
-                Paux = fPaux(jz, nU)
-
-                'Maximum allowable Battery-power
-                BAT.Bat_Pzul(jz)
-                PeBatMax = Math.Max(BAT.PmaxAntr - Paux, 0)     'Paux reduziert maximale Entlade-Leistung
-                PeBatMin = Math.Min(BAT.PmaxLaden - Paux, 0)    'Paux erhöht (!) maximale Lade-Leistung
-
-                'Maximale EM-Leistung. (Batterieleistung limitiert EM-Leistung) |@@| Maximum EM-Power (Battery-power limited by EM power)
-                EMmax = EMO.PeMax(nU)
-                Do While EMO.PiEM(nU, EMmax) > PeBatMax
-                    EMmax *= 0.995
-                Loop
-
-                EMmin = EMO.PeMin(nU)
-                Do While EMO.PiEM(nU, EMmax) < PeBatMin
-                    EMmax *= 0.995
-                Loop
-
-                'Leistung bis ICE/EM (= an Kupplung) berechnen |@@| Power to ICE/EM (= coupling to) get
-                PlossGB = fPlossGB(PvorD, Vist, Gear)
-                PlossDiff = fPlossDiff(PvorD, Vist)
-                PlossRt = fPlossRt(Vist, Gear)
-                PaGetr = fPaG(Vist, aist)
-
-                'Power to clutch
-                Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt
-
-                'PaMot
-                If Nvorg Then
-                    'Revolutions-setting
-                    PaICE = (VEH.I_mot * MODdata.dnUvorg(jz) * 0.01096 * MODdata.nUvorg(jz)) * 0.001
-                    PaEM = (EMO.I_mot * MODdata.dnUvorg(jz) * 0.01096 * MODdata.nUvorg(jz)) * 0.001
-                Else
-                    PaICE = ((VEH.I_mot * (VEH.AchsI * VEH.Igetr(Gear) / (0.5 * VEH.Dreifen)) ^ 2) * aist * Vist) * 0.001
-                    PaEM = ((EMO.I_mot * (VEH.AchsI * VEH.Igetr(Gear) / (0.5 * VEH.Dreifen)) ^ 2) * aist * Vist) * 0.001
-                End If
-
-                '***** Power required in EV-mode
-                '   Power to Clutch plus EM-inertia
-                PeEV = Pkup + PaEM
-                '! CAUTION: If ICE is engaged then PaICE must also be !  => Later in power distribution
-
-                '***** Power required in the ICE+EM-operation
-                PeKomb = Pkup + PaICE + PaEM
-
-                '***** Power required in ICE-operation
-                PeICEonly = Pkup + PaICE
-
-                '***** Check whether EV possible
-                '   => Bat <> Low
-                '   => EM-Power >= Drivetrain-power
-                '   => v < vEVo
-                If BatLvl <> tBatLvl.Empty And BatLvl <> tBatLvl.Low And PeEV <= EMmax And Under_vEVo Then ModeCheck(tHEVparMode.EV) = True
-
-                '***** If EV possible: check whether critical
-                If ModeCheck(tHEVparMode.EV) And PeEV > 0.9 * EMmax Then EVcrit = True
-
-                '***** Check whether Assist / LPI / ICEonly is possible and if Boost is needed
-                '   => ICE-On must be possible (ICElock)
-                If ICElock <> tICElock.OffLock Then
-
-                    'Assist / Boost
-                    '   => SOC > MIN
-                    If BatLvl <> tBatLvl.Empty Then
-                        ModeCheck(tHEVparMode.Assist) = True
-                        'Boost
-                        '   => ICE at Full-load
-                        If PeICEonly > ICEmax Then NeedBoost = True
-                    End If
-
-                    'LPI
-                    '   => Bat <> High
-                    If BatLvl <> tBatLvl.High Then ModeCheck(tHEVparMode.LPI) = True
-
-                    'ICEonly
-                    ModeCheck(tHEVparMode.ICEonly) = True
-
-                End If
-
-                '***** Check whether Recuparation possible
-                ModeCheck(tHEVparMode.Rekup) = (BatLvl <> tBatLvl.Full)
-                Pbrake = 0
-
-
-                '***********************************************************************************************
-                '********************************* Driving-state distinction *********************************
-                '***********************************************************************************************
-
-                If Pplus Then
-
-                    '****************************************************************************************
-                    '***************************** Transmission-Mode pre-selection ********************************
-
-                    If NeedBoost Then
-
-                        'if Boost necessary (and possible), then no Choice
-                        HEVmode0 = tHEVparMode.Assist
-
-                    ElseIf ModeCheck(tHEVparMode.EV) Then
-
-                        'EV mode when ...
-                        If Not ModeCheck(tHEVparMode.ICEonly) Or Under_vEVu Or BatLvl = tBatLvl.High Then  'ICE nicht möglich, Vist unter EVu oder Batterieladung hoch 
-
-                            HEVmode0 = tHEVparMode.EV
-
-                        End If
-
-                    Else
-
-                        'If EV & ICE is not possible then EV-mode till ICE starts again .... should never happen because no ICE-shutdown when little SOC
-                        If Not ModeCheck(tHEVparMode.ICEonly) Then
-
-                            HEVmode0 = tHEVparMode.EV
-
-                        End If
-
-                    End If
-
-
-                    'If use of HEV strategy:
-                    '   Ke's calculation
-                    If HEVmode0 = tHEVparMode.Undefined Then
-
-                        '************** Calculate optimal Ke's and Power for it ************
-
-                        'Emission/Consumption in g/h
-                        FCbasis = MAP.GetSingleValue(tMapComp.FC, nn, PeICEonly / VEH.Pnenn)
-
-                        '***********************************************************************
-                        '******************************* KeSTE *********************************
-                        '***********************************************************************
-
-                        'KeSTE from STE-curve ...
-                        KeSTE = HEV.STEintp(SOC0)
-
-
-                        '***********************************************************************
-                        '******************************** KeA **********************************
-                        '***********************************************************************
-
-                        If ModeCheck(tHEVparMode.Assist) Then
-                            bAbort = False
-                            Pel = 0
-                            PelOpt = 0
-                            PeKeAoptICE = 0
-                            KeAmin = 999999
-                            Do While Pel + PelStep < EMmax
-                                Pel += PelStep
-                                Pvkm = PeKomb - Pel
-
-                                'Remain under Max-Pe
-                                If Pvkm > ICEmax Then Continue Do
-
-                                'If Pvkm negative: Calculation of the pure EM-transmission?(Betrieb)
-                                If Pvkm <= 0 Then
-
-                                    '    ...not valid if Batlvl <= Low or ICEonLock
-                                    If Not ModeCheck(tHEVparMode.EV) Or ICElock = tICElock.OnLock Then Exit Do
-
-                                    'EM-Power = P-Drivetrain
-                                    Pel = PeEV
-                                    Pvkm = 0
-
-                                    'Consumption-reduction in g/h
-                                    FCminus = FCbasis
-
-                                    'Abort according to this calculation (more EM-power makes no sense because Drivetrain already pure electric)
-                                    bAbort = True
-
-                                Else
-
-                                    'Consumption-savings in g/h
-                                    FCminus = FCbasis - MAP.GetSingleValue(tMapComp.FC, nn, Pvkm / VEH.Pnenn)
-
-                                End If
-
-                                'Power to electric motor in kW
-                                Pmot = EMO.PiEM(nU, Pel)
-
-                                If Pmot > PeBatMax Then
-                                    If bAbort Then
-                                        Exit Do
-                                    Else
-                                        Continue Do
-                                    End If
-                                End If
-
-                                'Power in battery
-                                Pbat = BAT.PiBat(Pmot)
-
-                                If Pbat = 0 Then Stop
-
-                                'Div/0 and Sign checks
-                                If FCminus > 0 Then
-
-                                    'KeA calculated in kWh/kg
-                                    KeA = 1000 * Pbat / FCminus
-
-                                    'Check whether Optimum
-                                    If KeA < KeAmin Then
-                                        KeAmin = KeA
-                                        PelOpt = Pel
-                                        PeKeAoptICE = Pvkm
-                                    End If
-                                End If
-
-                                'Abort when already reached pure EM-mode
-                                If bAbort Then Exit Do
-
-                            Loop
-
-                            PeKeAoptEM = PelOpt
-
-                            KeA = KeAmin
-
-                            DeltaA = KeSTE - KeA
-
-                        Else
-
-                            DeltaA = -1
-
-                        End If
-
-
-                        '***********************************************************************
-                        '******************************** KeG **********************************
-                        '***********************************************************************
-
-                        If ModeCheck(tHEVparMode.LPI) Then
-                            bAbort = False
-                            Pel = 0
-                            PelOpt = 0
-                            PeKeGoptICE = 0
-                            KeGmax = 0
-                            Do While Pel - PelStep > EMmin
-
-                                Pel -= PelStep
-                                Pvkm = PeKomb - Pel
-
-                                'If Pvkm at Full-load:
-                                If Pvkm > 0.99 * ICEmax Then
-
-                                    'Put Pvkm on full load
-                                    Pvkm = 0.99F * ICEmax
-
-                                    'EM in generator-mode (Pges1 - Pvkm < 0)
-                                    Pel = PeKomb - Pvkm
-
-                                    'Abort after this pass because Generating more impossible
-                                    bAbort = True
-
-                                End If
-
-                                'Additional consumption in g/h
-                                FCplus = MAP.GetSingleValue(tMapComp.FC, nn, Pvkm / VEH.Pnenn) - FCbasis
-
-                                'Power to Electric-motor in kW
-                                Pmot = EMO.PiEM(nU, Pel)
-
-                                If Pmot < PeBatMin Then
-                                    If bAbort Then
-                                        Exit Do
-                                    Else
-                                        Continue Do
-                                    End If
-                                End If
-
-                                'Power in battery
-                                Pbat = BAT.PiBat(Pmot)
-
-                                If Pbat = 0 Then Exit Do
-
-                                'Div/0 and Sign checks
-                                If FCplus > 0 Then
-
-                                    'Calculate KeG in kWh/kg
-                                    KeG = -1000 * Pbat / FCplus
-
-                                    'Check whether Optimum
-                                    If KeG > KeGmax Then
-                                        KeGmax = KeG
-                                        PelOpt = Pel
-                                        PeKeGoptICE = Pvkm
-                                    End If
-
-                                End If
-
-                                'Abort when already reached VKM-full-load
-                                If bAbort Then Exit Do
-
-                            Loop
-
-                            PeKeGoptEM = PelOpt
-
-                            KeG = KeGmax
-
-                            'Abstand Eta zu Kurve berechnen |@@| Calculate Distance Eta from Curve
-                            DeltaG = KeG - KeSTE
-
-                        Else
-
-                            DeltaG = -1
-
-                        End If
-
-                        '***********************************************************************
-                        '********************** Evaluate KeSTE, Deltas ************************
-                        '***********************************************************************
-
-                        If DeltaG < 0 And DeltaA < 0 Then
-                            KeFail = True
-                        Else
-                            If (DeltaA > DeltaG) And ModeCheck(tHEVparMode.Assist) Then
-                                HEVmodeByKe = tHEVparMode.Assist
-                            ElseIf DeltaG > 0 And ModeCheck(tHEVparMode.LPI) Then
-                                HEVmodeByKe = tHEVparMode.LPI
-                            Else
-                                KeFail = True
-                            End If
-                        End If
-
-                        If KeFail Then
-                            If ModeCheck(tHEVparMode.EV) Then
-                                If LastHEVmode = tHEVparMode.EV Or LastEngState = tEngState.Stopped Or LastEngState = tEngState.Idle Then
-                                    HEVmodeByKe = tHEVparMode.EV
-                                Else
-                                    HEVmodeByKe = tHEVparMode.ICEonly
-                                End If
-                            Else
-                                HEVmodeByKe = tHEVparMode.ICEonly
-                            End If
-                        End If
-
-
-                        '***********************************************************************
-                        '************************* Operating strategy ***************************
-                        '***********************************************************************
-
-                        'LastHEVmode-Check
-                        If Not FirstSec Then
-
-
-                            Select Case LastHEVmode
-                                Case tHEVparMode.Undefined, tHEVparMode.Rekup
-                                    LastHEVnotPossible = True
-                                    PvkmAlt = 0
-                                Case Else
-                                    LastHEVnotPossible = Not ModeCheck(LastHEVmode)
-
-                                    Select Case LastHEVmode
-
-                                        Case tHEVparMode.Assist
-                                            PvkmAlt = PeKeAoptICE
-                                        Case tHEVparMode.LPI
-                                            PvkmAlt = PeKeGoptICE
-                                        Case Else    ' tHEVparMode.ICEonly
-                                            PvkmAlt = PeICEonly
-
-                                    End Select
-
-                            End Select
-
-                        End If
-
-                        '** Ke-mode used when ...
-                        If HEVmodeByKe = LastHEVmode Or StateChange Or LastHEVnotPossible Then
-
-                            '...Same mode as before, change Driving-state or last mode impossible
-                            HEVmode0 = HEVmodeByKe
-
-                        Else
-
-                            '...when Engine is not running
-                            If LastEngState = tEngState.Stopped Then
-
-                                HEVmode0 = HEVmodeByKe
-
-                                '...if the PeICE Power-change is lowest with the new Mode
-                            Else
-
-                                Select Case HEVmodeByKe
-                                    Case tHEVparMode.Assist
-                                        Pvkm = PeKeAoptICE
-                                    Case tHEVparMode.LPI
-                                        Pvkm = PeKeGoptICE
-                                    Case tHEVparMode.ICEonly
-                                        Pvkm = PeICEonly
-                                End Select
-
-                                If Math.Abs(Pvkm - LastPeICE) < Math.Abs(PvkmAlt - LastPeICE) Then
-                                    HEVmode0 = HEVmodeByKe
-                                Else
-                                    HEVmode0 = LastHEVmode
-                                End If
-
-                            End If
-
-                        End If
-
-                    End If
-
-                    '********************************************************************************************
-                    '****************************** Distribute Power to each Mode **************************
-                    '********************************************************************************************
-
-                    Select Case HEVmode0
-
-                        Case tHEVparMode.EV
-
-                            'EM assumes the entire Power
-                            PeEM = PeEV
-
-                            'Speed reduced if power is too high for EM or Bat
-                            If PeEM > EMmax Or EMO.PiEM(nU, PeEM) > PeBatMax Then
-                                Vh.ReduceSpeed(jz, 0.995)
-                                GoTo lbGschw
-                            End If
-
-                            'If ICElock or EVcrit then ICE on (but disconnected)
-                            If ICElock = tICElock.OnLock Or (EVcrit And ICElock <> tICElock.OffLock) Then
-                                EngState0 = tEngState.Idle
-                            Else
-                                EngState0 = tEngState.Stopped
-                            End If
-
-                            PeICE = 0
-
-                            ICEclutch = False
-                            EMclutch = True
-
-                        Case tHEVparMode.ICEonly
-
-                            'ICE assumes the entire Drivetrain
-                            If PeICEonly > ICEmax Then
-                                Vh.ReduceSpeed(jz, 0.995)
-                                GoTo lbGschw
-                            End If
-
-                            PeEM = 0
-
-                            PeICE = PeICEonly
-
-                            EngState0 = tEngState.Load
-
-                            ICEclutch = True
-                            EMclutch = False
-
-                        Case tHEVparMode.Assist
-
-                            If NeedBoost Then
-
-                                If EMmax + PeKeAoptICE > PeKomb Then
-
-                                    PeICE = PeKeAoptICE
-                                    PeEM = PeKomb - PeICE
-
-                                ElseIf EMmax + ICEmax > PeKomb Then
-
-                                    PeICE = ICEmax
-                                    PeEM = PeKomb - PeICE
-
-                                Else
-
-                                    Vh.ReduceSpeed(jz, 0.995)
-                                    GoTo lbGschw
-
-                                End If
-
-                            Else
-
-                                PeICE = PeKeAoptICE
-                                PeEM = PeKeAoptEM
-
-                            End If
-
-                            EngState0 = tEngState.Load
-
-                            ICEclutch = True
-                            EMclutch = True
-
-                        Case tHEVparMode.LPI
-
-                            PeICE = PeKeGoptICE
-                            PeEM = PeKeGoptEM
-
-                            EngState0 = tEngState.Load
-
-                            ICEclutch = True
-                            EMclutch = True
-
-                    End Select
-
-                    If EngState0 = tEngState.Load Then
-                        If Math.Abs(P / ICEmax - 1) < 0.02 Then EngState0 = tEngState.FullLoad
-                    End If
-
-                ElseIf Pminus Then
-
-                    HEVmode0 = tHEVparMode.Rekup
-
-                    'CAUTION: ICEclutch defaults to 'false' so here no more statements
-
-                    'Calculate maximum Recuparation-Power
-                    PrekupMax = fPrekupMax()
-
-                    If PrekupMax > PvorD Then 'Falls Rekup-Limit erreicht
-
-                        'Mit PrekupMax auf EM/ICE zurück rechnen |@@| Calculate back PrecupMax from(auf) EM/ICE
-                        PlossGB = fPlossGB(PrekupMax, Vist, Gear)
-                        PlossDiff = fPlossDiff(PrekupMax, Vist)
-                        PlossRt = fPlossRt(Vist, Gear)
-                        Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt
-                        PeKomb = Pkup + PaICE + PaEM
-                        PeICEonly = Pkup + PaICE
-                        PeEV = Pkup + PaEM
-
-                        'Den Rest gleich auf die Bremse  |@@| The Residual equals that to(auf) the Brakes
-                        Pbrake = PvorD - PrekupMax
-
-                    End If
-
-                    'Default for ICE (so as to save the "Else" statement)
-                    PeICE = 0
-                    EngState0 = tEngState.Stopped
-
-                    If ModeCheck(tHEVparMode.Rekup) Then    'Falls Rekuperation möglich...
-
-                        If ICElock = tICElock.OnLock Then   'Falls ICElock, dann ICE-Schub dazu wenn EM nicht ausreicht. Basis ist immer PeKomb
-
-                            'Compute EM-power
-                            PeEM = PeKomb
-
-                            If PeEM < EMmin Then    'Falls maximale EM-Max-Rekup überschritten...
-
-                                'New EM-performance
-                                PeEM = EMmin
-
-                                'Residual power to ICE
-                                PeICE = PeKomb - PeEM
-                                EngState0 = tEngState.Drag
-
-                                'If ICE over Drag-curve
-                                If PeICE < ICEmin Then
-
-                                    'New ICE power
-                                    PeICE = ICEmin
-
-                                    'Rest to Brakes
-                                    Pbrake += PeKomb - PeEM - PeICE
-
-                                End If
-
-                            Else    'Falls EM-Max-Rekup nicht überschritten
-
-                                'ICE is idle (because On-Lock)
-                                EngState0 = tEngState.Idle
-
-                            End If
-
-                            ICEclutch = True
-
-                        Else    'Falls nicht ICElock, dann ICE-Schub nur dazu wenn ICE nicht aus. Basis ist PeEV
-
-                            'Compute EM-power
-                            PeEM = PeEV
-
-                            If PeEM < EMmin Then    'Falls maximale EM-Max-Rekup überschritten...
-
-                                'New EM-performance
-                                PeEM = EMmin
-
-                                If LastEngState <> tEngState.Stopped And PeKomb < EMmin Then    'Falls ICE nicht aus und kombinierte Leistung unter EM-Max-Rekup dann ICE in Schub
-
-                                    'ICE im Schubbetrieb |@@| ICE on the overrun
-                                    PeICE = PeKomb - PeEM
-                                    EngState0 = tEngState.Drag
-
-                                    'If ICE over Drag-curve
-                                    If PeICE < ICEmin Then
-
-                                        'New ICE-power
-                                        PeICE = ICEmin
-
-                                        'The rest to Brakes
-                                        Pbrake += PeKomb - PeEM - PeICE
-
-                                    End If
-
-                                    ICEclutch = True
-
-                                Else    'Falls ICE nicht verfügbar dann mechanisch dazu bremsen
-
-                                    Pbrake += PeEV - PeEM
-
-                                End If
-
-                            End If
-
-                        End If
-
-                        EMclutch = True
-
-                    Else    'Falls Rekuperation nicht möglich
-
-                        If LastEngState <> tEngState.Stopped Then  'Falls ICE nicht aus dann Schub
-
-                            'ICE on the Overrun(Schubbetrieb)
-                            PeICE = PeICEonly
-                            EngState0 = tEngState.Drag
-
-                            'When ICE above Drag-curve
-                            If PeICE < ICEmin Then
-
-                                'New ICE-power
-                                PeICE = ICEmin
-
-                                'The rest of on Brakes
-                                Pbrake += PeKomb - PeEM - PeICE
-
-                            End If
-
-                        Else    'Falls ICE aus dann alles mechanisch bremsen
-
-                            Pbrake = PvorD
-
-                        End If
-
-
-                    End If
-
-                    If EngState0 = tEngState.Drag Then
-                        If Math.Abs(P / ICEmin - 1) < 0.02 Then EngState0 = tEngState.FullDrag
-                    End If
-
-                Else
-
-                    'Power zero
-                    PeICE = 0
-                    PeEM = 0
-                    ICEclutch = False
-                    EMclutch = False
-
-                End If
-
-            End If
-
-            '************************************************************************************
-            '****************************** Clutch and Revolutions *******************************
-            '************************************************************************************
-
-            'Main clutch => must already be known here!
-            'If ICEclutch Then
-            '    If PeICE > 0 And fnn(Vist, Gear, False) < Kuppln_norm Then
-            '        Clutch = tEngClutch.Slipping
-            '    Else
-            '        Clutch = tEngClutch.Closed
-            '    End If
-            'ElseIf EMclutch Then
-            '    Clutch = tEngClutch.Closed
-            'Else
-            '    Clutch = tEngClutch.Opened
-            'End If
-
-            '************************************ ICE Revolutions************************************
-            If ICEclutch Then
-
-                nnICE = fnn(Vist, Gear, Clutch = tEngClutch.Slipping)
-                nUICE = nnICE * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl
-
-            Else
-
-                If EngState0 = tEngState.Stopped Then
-                    nU0 = 0
-                ElseIf EngState0 = tEngState.Idle Then
-                    nU0 = VEH.nLeerl
-                Else
-
-                    Stop
-
-                End If
-
-
-                If FirstSec Then
-                    nUICE = nU0
-                Else
-
-                    If Math.Abs(nU0 - MODdata.nU(jz - 1)) < 0.00001 Then
-
-                        nUICE = MODdata.nU(jz - 1)
+                        Pbrake = PvorD - (Pkup - PlossGB - PlossDiff - PaGetr - PlossRt)
 
+                        EngState0 = tEngState.FullDrag
                     Else
-
-                        nUICE = MODdata.nU(jz - 1)
-                        P = FLD.Pdrag(MODdata.nn(jz - 1))
-                        omega1 = nUICE * 2 * Math.PI / 60
-                        M = -P * 1000 * 60 / (2 * Math.PI * nUICE)
-                        omega_p = M / VEH.I_mot
-                        omega2 = omega1 - omega_p
-                        nUICE = Math.Max(nU0, omega2 * 60 / (2 * Math.PI))
-
+                        Pbrake = 0
                     End If
-
                 End If
-
-                nnICE = (nUICE - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl)
-
             End If
 
-            '************************************ EM Revolutions ​​*************************************
-            If EMclutch Then
-                nUEM = fnU(Vist, Gear, Clutch = tEngClutch.Slipping)
-            Else
-                nUEM = 0
+            'Check or Abort (before Speed-reduce-iteration, otherwise it hangs)
+            If PHEMworker.CancellationPending Then Return True
+
+            'Check whether P above Full-load => Reduce Speed
+            If Pplus And P > Pmax Then
+                If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then
+                    If Vist > 0.01 Then
+                        Select Case P / Pmax
+                            Case Is > 1.6
+                                Vh.ReduceSpeed(jz, 0.99)
+                            Case Is > 1.3
+                                Vh.ReduceSpeed(jz, 0.995)
+                            Case Else
+                                Vh.ReduceSpeed(jz, 0.999)
+                        End Select
+                        FirstSecItar = False
+                        GoTo lbGschw
+                    Else
+                        'ERROR: Speed Reduction brings nothing? ...
+                        WorkerMsg(tMsgID.Err, "Speed reduction failed!", MsgSrc & "/t= " & jz + 1)
+                        Return False
+                    End If
+                Else 'tEngState.Idle, tEngState.Stopped, tEngState.Drag
+                    'ERROR:  Engine not in Drivetrain ... can it be?
+                    If FirstSecItar Then
+                        If P > 0.1 Then WorkerMsg(tMsgID.Warn, "Pwheel > 0 but EngState undefined ?!", MsgSrc & "/t= " & jz + 1)
+                    End If
+                End If
             End If
 
-            '**************************************************************************************
-            '********************************* EM => Batterie *************************************
-            '**************************************************************************************
 
-            PiEM = EMO.PiEM(nUEM, PeEM)
+            'Interruption of traction(Zugkraftunterbrechung)
+            If TracIntrI > 0 Then
 
-            PeBat0 = Paux + PiEM
+                If Not TracIntrOn Then
 
-            BAT.Bat_Calc(PeBat0, jz)
+                    If jz > 0 AndAlso Gear > 0 AndAlso MODdata.Gear(jz - 1) > 0 AndAlso Gear <> MODdata.Gear(jz - 1) Then
 
-            PiBat0 = PeBat0 + BAT.PbatV
+                        TracIntrGear = Gear
+                        Gear = 0
+                        Clutch = tEngClutch.Opened
+                        TracIntrIx = 0
+                        TracIntrOn = True
 
+                        If TracIntrIx + 1 = TracIntrI Then
+                            ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx)
+                        Else
+                            ZgkrDt = 1
+                        End If
 
-            '-------------------------------------------------------
-            '------------------------- PNR -------------------------
-            '-------------------------------------------------------
+                        Vrollout = fRolloutSpeed(jz, ZgkrDt)
 
-            If PHEMworker.CancellationPending Then Return True
+                        If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz, Vrollout)
 
-            '   Finish Second
+                        GoTo lbGschw
 
-            If FirstSec Then FirstSec = False
+                    End If
 
-            'ICE-Lock
-            '   ACHTUNG: Die beiden If-Schleifen nicht verbinden weil LockCount sich sonst verzählt |@@| CAUTION: The two If-Schleifen do not bind(verbiden) because LockCount is miscounted
-            If ICElock <> tICElock.NoLock Then
-                LockCount += 1
-                If LockCount > GEN.StStT Then
-                    LockCount = 0
-                    ICElock = tICElock.NoLock
                 End If
+
             End If
 
-            If ICElock = tICElock.NoLock Then
-                If EngState0 = tEngState.Stopped Then
-                    If LastEngState <> tEngState.Stopped Then ICElock = tICElock.OffLock
+            '--------------------------------------------------------------------------------------------------
+            '------------------------- PNR --------------------------------------------------------------------
+            '--------------------------------------------------------------------------------------------------
+            '   Finish Second
+
+            'Start / Stop - Activation-Speed Control
+            If GEN.StartStop Then
+                If StStAus Then
+                    If Not EngState0 = tEngState.Stopped Then
+                        StStTx += 1
+                        If StStTx > GEN.StStT Then
+                            StStTx = 1
+                            StStAus = False
+                        End If
+                    End If
                 Else
-                    If LastEngState = tEngState.Stopped Then ICElock = tICElock.OnLock
+                    If EngState0 = tEngState.Stopped Then StStAus = True
                 End If
             End If
 
             'Write Modal-values Fields
-            MODdata.Pe.Add(PeICE / VEH.Pnenn)
-            MODdata.nn.Add(nnICE)
-            MODdata.nU.Add(nUICE)
+            MODdata.Pe.Add(P / VEH.Pnenn)
+            MODdata.nn.Add(nn)
+            MODdata.nU.Add(nU)
+
             MODdata.EngState.Add(EngState0)
 
             MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz)))
@@ -3128,50 +1180,83 @@ lbGschw:
             MODdata.PlossGB.Add(PlossGB)
             MODdata.PlossDiff.Add(PlossDiff)
             MODdata.PlossRt.Add(PlossRt)
-            MODdata.PaEng.Add(PaICE)
+            MODdata.PaEng.Add(PaMot)
             MODdata.PaGB.Add(PaGetr)
 
             MODdata.VehState.Add(VehState0)
             MODdata.Gear.Add(Gear)
 
-            PeEMot.Add(PeEM)
-            PiEMot.Add(PiEM)
-            PeBat.Add(PeBat0)
-            PiBat.Add(PiBat0)
-            Ubat.Add(BAT.Ubat)
-            Ibat.Add(BAT.Ibat)
-            SOC.Add(BAT.SOC)
-            TempBat.Add(BAT.TempBat)
+            If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0)
 
-            SOC0 = BAT.SOC
+            'Interruption of traction(Zugkraftunterbrechung)
+            If TracIntrTurnOff Then
 
+                TracIntrOn = False
+                TracIntrTurnOff = False
 
-            If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0)
+            ElseIf TracIntrOn Then
+
+                TracIntrIx += 1
+
+                If TracIntrIx = TracIntrI Then
+
+                    TracIntrTurnOff = True
+
+                ElseIf jz < MODdata.tDim Then
 
+                    If TracIntrIx + 1 = TracIntrI Then
+                        ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx)
+                    Else
+                        ZgkrDt = 1
+                    End If
+
+                    Vrollout = fRolloutSpeed(jz + 1, ZgkrDt)
+                    If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz + 1, Vrollout)
 
-            LastEngState = EngState0
-            LastHEVmode = HEVmode0
-            LastPeICE = PeICE
+                End If
+
+            End If
 
             If Vh.Vsoll(jz) - Vist > 1.5 Then SecSpeedRed += 1
 
-            'Notify
+
+            LastGearChange = -1
+            For i = jz - 1 To 0 Step -1
+                If MODdata.Gear(i) <> 0 Then
+                    If MODdata.Gear(i) <> Gear Then
+                        LastGearChange = i
+                        Exit For
+                    End If
+                End If
+            Next
+
+
+            LastClutch = Clutch
+
+            'Messages
             If MODdata.ModErrors.MsgOutputAbort(jz + 1, MsgSrc) Then Return False
 
+            If Clutch = tEngClutch.Closed And Nvorg Then
+                If Math.Abs(nU - fnU(Vist, Gear, False)) > 0.2 * VEH.nNenn Then
+                    WorkerMsg(tMsgID.Warn, "Target rpm =" & nU & ", calculated rpm(gear " & Gear & ")= " & fnU(Vist, Gear, False), MsgSrc & "/t= " & jz + 1)
+                End If
+            End If
+
+
         Loop Until jz >= MODdata.tDim
 
         '***********************************************************************************************
-        '*********************************    Time-loop END **************************************
+        '***********************************    Time loop END ***********************************
         '***********************************************************************************************
 
-        'Notify (Not ADVANCE)
+        'Notify (When not ADVANCE)
         If NotAdvMode Then
 
             If Cfg.WegKorJa Then
-                If MODdata.tDim > TzyklOgl Then WorkerMsg(tMsgID.Warn, "Cycle extended by " & MODdata.tDim - TzyklOgl & " seconds.", MsgSrc)
+                If MODdata.tDim > MODdata.tDimOgl Then WorkerMsg(tMsgID.Normal, "Cycle extended by " & MODdata.tDim - MODdata.tDimOgl & " seconds.", MsgSrc)
             End If
 
-            If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Warn, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc)
+            If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Normal, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc)
 
         End If
 
@@ -3182,6 +1267,125 @@ lbGschw:
 
     End Function
 
+    Public Function Eng_Calc() As Boolean
+
+        Dim Pmr As Single
+        Dim t As Integer
+        Dim t1 As Integer
+        Dim PminN As Single
+        Dim PmaxN As Single
+        Dim nnDRI As List(Of Double)
+        Dim PeDRI As List(Of Double)
+        Dim PcorCount As Integer
+        Dim StdMode As Boolean
+        Dim NotAdvMode As Boolean
+        Dim MsgSrc As String
+
+        MsgSrc = "Power/Eng_Calc"
+
+        StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD)
+        NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE)
+
+        'Abort if Power/Revolutions not given
+        If Not (DRI.Nvorg And DRI.Pvorg) Then
+            WorkerMsg(tMsgID.Err, "Load cycle is not valid! rpm and load required.", MsgSrc)
+            Return False
+        End If
+
+        PcorCount = 0
+        t1 = MODdata.tDim
+        nnDRI = DRI.Values(tDriComp.nn)
+        PeDRI = DRI.Values(tDriComp.Pe)
+
+        'Drehzahlen vorher weil sonst scheitert die Pmr-Berechnung bei MODdata.nU(t + 1) |@@| Revolutions previously, otherwise Pmr-calculation fails at MODdata.nU(t + 1)
+        For t = 0 To t1
+            'Write Modal value Fields
+            '   Allocate MODdata.Pe
+            MODdata.nn.Add(nnDRI(t))
+            MODdata.nU.Add(Math.Max(0, nnDRI(t) * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl))
+        Next
+
+        'Power calculation
+        For t = 0 To t1
+
+            'Secondary Progressbar
+            If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * t / t1)
+
+            'Reset the second-by-second Errors
+            MODdata.ModErrors.ResetAll()
+
+            'OLD and wrong because not time shifted: P_mr(jz) = 0.001 * (I_mot * 0.0109662 * (n(jz) * nnrom) * nnrom * (n(jz) - n(jz - 1))) / Pnrom
+            If t > 0 And t < t1 Then
+                Pmr = 0.001 * (VEH.I_mot * (2 * Math.PI / 60) ^ 2 * MODdata.nU(t) * 0.5 * (MODdata.nU(t + 1) - MODdata.nU(t - 1))) / VEH.Pnenn
+            Else
+                Pmr = 0
+            End If
+
+            'Power of the Cycle corrected by P_clutch
+            MODdata.Pe.Add(PeDRI(t) + Pmr)
+
+            'Revolutions of the Cycle => Determined in Cycle-init
+            'If Revolutions under idle, assume Engine is stopped
+            If MODdata.nn(t) < Cfg.nnormEngStop Then
+                EngState0 = tEngState.Stopped
+            Else
+                PminN = FLD.Pdrag(MODdata.nn(t)) / VEH.Pnenn
+
+                If t = 0 Then
+                    PmaxN = FLD.Pfull(MODdata.nn(t)) / VEH.Pnenn
+                Else
+                    PmaxN = FLD.Pfull(MODdata.nn(t), MODdata.Pe(t - 1)) / VEH.Pnenn
+                End If
+
+                'If Pmax < 0 or Pmin >  0 then Abort with Error!
+                If PminN >= 0 AndAlso MODdata.Pe(t) < 0 Then
+                    WorkerMsg(tMsgID.Err, "Pe_drag > 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1)
+                    Return False
+                ElseIf PmaxN <= 0 AndAlso MODdata.Pe(t) > 0 Then
+                    WorkerMsg(tMsgID.Err, "Pe_full < 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1)
+                    Return False
+                End If
+
+                'FLD Check
+                If MODdata.Pe(t) > PmaxN Then
+                    If MODdata.Pe(t) / PmaxN > 1.05 Then PcorCount += 1
+                    MODdata.Pe(t) = PmaxN
+                ElseIf MODdata.Pe(t) < PminN Then
+                    If MODdata.Pe(t) / PminN > 1.05 Then PcorCount += 1
+                    MODdata.Pe(t) = PminN
+                End If
+
+                Select Case MODdata.Pe(t)
+                    Case Is > 0.0001  'Antrieb
+                        If Math.Abs(MODdata.Pe(t) / PmaxN - 1) < 0.01 Then
+                            EngState0 = tEngState.FullLoad
+                        Else
+                            EngState0 = tEngState.Load
+                        End If
+                    Case Is < -0.0001   'Schlepp
+                        If MODdata.Pe(t) < 1.01 * PminN Then
+                            EngState0 = tEngState.FullDrag
+                        Else
+                            EngState0 = tEngState.Drag
+                        End If
+                    Case Else
+                        EngState0 = tEngState.Idle
+                End Select
+            End If
+
+            MODdata.EngState.Add(EngState0)
+
+            'Notify
+            If MODdata.ModErrors.MsgOutputAbort(t + 1, MsgSrc) Then Return False
+
+        Next
+
+        If PcorCount > 0 Then WorkerMsg(tMsgID.Warn, "Power corrected (>5%) in " & PcorCount & " time steps.", MsgSrc)
+
+        Return True
+
+    End Function
+
     Private Function fRolloutSpeed(ByVal t As Integer, ByVal dt As Single) As Single
 
         Dim vstep As Double
@@ -5019,6 +3223,11 @@ lb20:
         End If
         Return U
     End Function
+
+    Private Function fnUout(ByVal V As Single, ByVal Gear As Integer) As Single
+        Return CSng(V * 60.0 * VEH.AchsI * VEH.Igetr(Gear) / (VEH.Dreifen * Math.PI))
+    End Function
+
 #End Region
 
 #Region "Leistungsberechnung"
diff --git a/VECTO/M_MAIN.vb b/VECTO/M_MAIN.vb
index 090ae6cb42..46882d61d0 100644
--- a/VECTO/M_MAIN.vb
+++ b/VECTO/M_MAIN.vb
@@ -34,7 +34,6 @@ Module M_MAIN
 
         Dim i As Integer
         Dim path0 As String
-        Dim LicErrorFeat As Short
         Dim JobAbortedByErr As Boolean
         Dim CyclAbrtedByErr As Boolean
         Dim MsgOut As Boolean
@@ -68,16 +67,12 @@ Module M_MAIN
         MsgOut = (PHEMmode = tPHEMmode.ModeSTANDARD)
 
         'License check
-        LicErrorFeat = 0
-        If (PHEMmode = tPHEMmode.ModeBATCH) Then
-            If Not Lic.LicFeature(1) Then LicErrorFeat = 1
-        ElseIf (PHEMmode = tPHEMmode.ModeADVANCE) Then
-            If Not Lic.LicFeature(2) Then LicErrorFeat = 2
-        End If
 
-        If LicErrorFeat > 0 Then
-            WorkerMsg(tMsgID.Err, "Your license does not support the selected mode (" & LicErrorFeat & ")", MsgSrc)
-            GoTo lbErrBefore
+        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
@@ -203,29 +198,6 @@ lbADV:
                 GoTo lbNextJob
             End If
 
-            'Check if all the modes are licensed in the GEN file
-            LicErrorFeat = 0
-
-            If GEN.VehMode = tVehMode.HEV Then
-                If Not Lic.LicFeature(5) Then LicErrorFeat = 5
-            ElseIf GEN.VehMode = tVehMode.EV Then
-                If Not Lic.LicFeature(6) Then LicErrorFeat = 6
-            End If
-
-            If GEN.CreateMap And Not Lic.LicFeature(3) Then LicErrorFeat = 3
-
-            If GEN.EngAnalysis And Not Lic.LicFeature(4) Then LicErrorFeat = 4
-
-            If (GEN.dynkorja And Not Lic.LicFeature(7)) Then LicErrorFeat = 7
-
-            If (GEN.EXSja And Not Lic.LicFeature(8)) Then LicErrorFeat = 8
-
-            If LicErrorFeat > 0 Then
-                WorkerMsg(tMsgID.Err, "Your license does not support the selected mode (" & LicErrorFeat & ")", MsgSrc)
-                JobAbortedByErr = True
-                GoTo lbNextJob
-            End If
-
             'If optimizer is active, then read parameters here
             If bOptOn Then OptInput()
 
@@ -407,6 +379,14 @@ lbADV:
                             GoTo lbNextJob
                         End If
 
+                        If DEV.ATmode Then
+                            If Not GBX.TCinit Then
+                                'Error-notification within GSinit()
+                                JobAbortedByErr = True
+                                GoTo lbNextJob
+                            End If
+                        End If
+
                         If GEN.ModeHorEV Then
 
                             If GEN.VehMode = tVehMode.EV Then
@@ -421,10 +401,11 @@ lbADV:
 
                                 If MsgOut Then WorkerMsg(tMsgID.Normal, "EV Calc", MsgSrc)
 
-                                If Not MODdata.Px.EV_Calc() Then
-                                    CyclAbrtedByErr = True
-                                    GoTo lbAusg
-                                End If
+                                '!!!!!!!! EV disabled !!!!!!!!!
+                                'If Not MODdata.Px.EV_Calc() Then
+                                CyclAbrtedByErr = True
+                                GoTo lbAusg
+                                'End If
 
                             Else
 
@@ -439,10 +420,11 @@ lbADV:
 
                                 If MsgOut Then WorkerMsg(tMsgID.Normal, "HEV Calc", MsgSrc)
 
-                                If Not MODdata.Px.HEV_Calc() Then
-                                    CyclAbrtedByErr = True
-                                    GoTo lbAusg
-                                End If
+                                '!!!!!!!! HEV disabled !!!!!!!!!
+                                'If Not MODdata.Px.HEV_Calc() Then
+                                CyclAbrtedByErr = True
+                                GoTo lbAusg
+                                'End If
 
                             End If
 
@@ -455,12 +437,12 @@ lbADV:
                                 GoTo lbAusg
                             End If
 
-                        End If
+                    End If
 
-                        If PHEMworker.CancellationPending Then GoTo lbAbort
+                    If PHEMworker.CancellationPending Then GoTo lbAbort
 
-                        'Calculate CycleKin (for erg/sum, etc.)
-                        MODdata.CylceKin.Calc()
+                    'Calculate CycleKin (for erg/sum, etc.)
+                    MODdata.CylceKin.Calc()
 
                     End If
                     '----------------------------------------------------------------------------
diff --git a/VECTO/VECTO.vbproj.user b/VECTO/VECTO.vbproj.user
index 1d8c42a49b..fa7c614a4e 100644
--- a/VECTO/VECTO.vbproj.user
+++ b/VECTO/VECTO.vbproj.user
@@ -17,5 +17,6 @@
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <StartArguments>
     </StartArguments>
+    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/VECTO/VECTO_Global.vb b/VECTO/VECTO_Global.vb
index 7bb1693c1e..f106ed8a61 100644
--- a/VECTO/VECTO_Global.vb
+++ b/VECTO/VECTO_Global.vb
@@ -2,7 +2,7 @@
 
 Module VECTO_Global
 
-    Public Const VECTOvers As String = "1.1 beta"
+    Public Const VECTOvers As String = "1.1 beta 2"
     Public MyAppPath As String
     Public MyConfPath As String
     Public MyDeclPath As String
@@ -51,7 +51,6 @@ Module VECTO_Global
     Public ProgBarCtrl As cProgBarCtrl
 
     Public SetCulture As Boolean       'Damit der Backgroundworker das richtige Format verwendet
-    Public FirstTime As Boolean
 
     Public Function nMtoPe(ByVal nU As Double, ByVal M As Double) As Double
         Return ((nU * 2 * Math.PI / 60) * M / 1000)
@@ -67,7 +66,7 @@ Module VECTO_Global
         Return Pnorm * VEH.Pnenn * 1000 / (nU * 2 * Math.PI / 60)
     End Function
 
-    Public Function PToM(ByVal nU As Single, ByVal Pe As Double) As Single
+    Public Function nPeToM(ByVal nU As Single, ByVal Pe As Double) As Single
         Return Pe * 1000 / (nU * 2 * Math.PI / 60)
     End Function
 
@@ -130,7 +129,7 @@ Module VECTO_Global
 
         x = sK.IndexOf("_")
 
-        If x = -1 Then Return tExsComp.Undefined
+        If x = -1 Then Return tAuxComp.Undefined
 
         sK = Left(sK, x + 1)
 
diff --git a/VECTO/cConfig.vb b/VECTO/cConfig.vb
index 9db078c0d7..2543c760d6 100644
--- a/VECTO/cConfig.vb
+++ b/VECTO/cConfig.vb
@@ -1,7 +1,7 @@
 Public Class cConfig
 
-    Private Const FormatVersion As Short = 1
-    Private FileVersion As Short
+    'Private Const FormatVersion As Short = 1
+    'Private FileVersion As Short
 
     Public GnVorgab As Boolean
     Private sWorkDPath As String
@@ -27,18 +27,20 @@
     Public FuelDens As Single
     Public CO2perFC As Single
 
+    Public FirstRun As Boolean
+
     Public Sub New()
         SetDefault()
     End Sub
 
     Public Function ConfigLOAD() As Boolean
         Dim c As New cFile_V3
-        Dim txt As String
+        'Dim txt As String
 
         SetDefault()
 
         If Not IO.File.Exists(MyConfPath & "settings.txt") Then
-            If Not FirstTime Then GUImsg(tMsgID.Err, "Config-file not found! Using default settings.")
+            If Not Cfg.FirstRun Then GUImsg(tMsgID.Err, "Config-file not found! Using default settings.")
             Return False
         End If
 
@@ -46,26 +48,26 @@
 
         '***
         '*** First line: Version
-        txt = Trim(UCase(c.ReadLine(0)))
-        If Microsoft.VisualBasic.Left(txt, 1) = "V" Then
-            ' "Remove V'' => It remains the number
-            txt = txt.Replace("V", "")
-            If Not IsNumeric(txt) Then
-                'If invalid version: Abort
-                GoTo lbEr
-            Else
-                'Version settled
-                FileVersion = CInt(txt)
-            End If
-        Else
-            c.Close()
-            Return ReadOldFormat()
-        End If
-
-        If FileVersion > FormatVersion Then
-            GUImsg(tMsgID.Err, "Config-file Version " & FileVersion & " incompatible with application version! Using default settings.")
-            Return False
-        End If
+        'txt = Trim(UCase(c.ReadLine(0)))
+        'If Microsoft.VisualBasic.Left(txt, 1) = "V" Then
+        '    ' "Remove V'' => It remains the number
+        '    txt = txt.Replace("V", "")
+        '    If Not IsNumeric(txt) Then
+        '        'If invalid version: Abort
+        '        GoTo lbEr
+        '    Else
+        '        'Version settled
+        '        FileVersion = CInt(txt)
+        '    End If
+        'Else
+        '    c.Close()
+        '    Return ReadOldFormat()
+        'End If
+
+        'If FileVersion > FormatVersion Then
+        '    GUImsg(tMsgID.Err, "Config-file Version " & FileVersion & " incompatible with application version! Using default settings.")
+        '    Return False
+        'End If
 
         sWorkDPath = Trim(c.ReadLine(0))
         If UCase(sWorkDPath) = sKey.HomePath Then
@@ -113,6 +115,13 @@
         FuelDens = CSng(c.ReadLine(0))
         CO2perFC = CSng(c.ReadLine(0))
 
+        If c.EndOfFile Then GoTo lbDone
+
+        FirstRun = CBool(c.ReadLine(0))
+
+
+lbDone:
+
         c.Close()
 
         Return True
@@ -244,6 +253,8 @@ lbDone:
 
         WorkDirHome = False
 
+        FirstRun = True
+
     End Sub
 
     Public Sub ConfigSAVE()
@@ -251,7 +262,7 @@ lbDone:
         c.OpenWrite(MyConfPath & "settings.txt")
 
         'Version
-        c.WriteLine("V" & FormatVersion)
+        'c.WriteLine("V" & FormatVersion)
 
         c.WriteLine("c Working Directory Path")
         If WorkDirHome And UCase(Trim(sWorkDPath)) = UCase(Trim(MyAppPath)) Then
@@ -302,6 +313,10 @@ lbDone:
         c.WriteLine("c CO2 per FC [kgCO2/kgFC]")
         c.WriteLine(CO2perFC.ToString)
 
+        c.WriteLine("c First Run (Show Quick Start Guide Prompt)")
+        c.WriteLine(Math.Abs(CInt(FirstRun)))
+
+
         c.Close()
         c = Nothing
     End Sub
diff --git a/VECTO/cDEV.vb b/VECTO/cDEV.vb
index 24fdb698c7..b1e7a96f78 100644
--- a/VECTO/cDEV.vb
+++ b/VECTO/cDEV.vb
@@ -9,6 +9,12 @@ Public Class cDEV
 
     Public GearCorrection As Boolean
 
+    Public ATmode As Boolean
+    Public TCiterPrec As Single
+    Public TCfile As String
+    Public TCnUstep As Single
+    Public TCnUstepMin As Single
+    Public TCnUref As Single
 
     '**************************************************************************************************************
     '**************************************************************************************************************
@@ -117,6 +123,31 @@ Public Class cDEV
         MyOptions.Add("GearCorrection", Conf0)
 
 
+        Conf0 = New cDEVoption(tDEVconfType.tBoolean, "Automatic Transmission. TC file required.", False)
+        Conf0.BoolVal = False
+        MyOptions.Add("ATmode", Conf0)
+
+        Conf0 = New cDEVoption(tDEVconfType.tStringVal, "TC file path")
+        Conf0.StringVal = ""
+        MyOptions.Add("TCfile", Conf0)
+
+        Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC reference rpm for input torque [1/min]")
+        Conf0.SingleVal = 1000
+        MyOptions.Add("TCnUref", Conf0)
+
+        Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC iteration: target precision for torque ratio")
+        Conf0.SingleVal = 0.001
+        MyOptions.Add("TCiterPrec", Conf0)
+
+        Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC iteration: start value for nU-step [1/min]")
+        Conf0.SingleVal = 100
+        MyOptions.Add("TCnUstep", Conf0)
+
+        Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC iteration: lowest value for nU-step [1/min]")
+        Conf0.SingleVal = 0.01
+        MyOptions.Add("TCnUstepMin", Conf0)
+
+
         '**************************** END: Parameters Configuration '*****************************
         '*****************************************************************************************
         '*****************************************************************************************
@@ -128,6 +159,12 @@ Public Class cDEV
     'Initialize the actual Config-Parameters from MyConfigs list
     Public Sub SetOptions()
         GearCorrection = MyOptions("GearCorrection").BoolVal
+        ATmode = MyOptions("ATmode").BoolVal
+        TCiterPrec = MyOptions("TCiterPrec").SingleVal
+        TCfile = MyOptions("TCfile").StringVal
+        TCnUstep = MyOptions("TCnUstep").SingleVal
+        TCnUstepMin = MyOptions("TCnUstepMin").SingleVal
+        TCnUref = MyOptions("TCnUref").SingleVal
     End Sub
 
     'Demo for Delegate Function
-- 
GitLab