From 65f72134aa3f40d73082d9a7be78a6654feab6f0 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Tue, 25 Aug 2020 09:46:40 +0200
Subject: [PATCH] refactor graphwriter to run HEV/BEV tests in parallel

---
 Tools/GraphDrawer/Program.cs                  |  65 ++--
 .../Integration/ADAS/ADASTests.cs             |  26 +-
 .../BatteryElectric/BatteryElectricTest.cs    | 332 +++++++++---------
 .../Integration/BusAuxiliaries/AAuxTests.cs   |  24 +-
 .../DriverStrategy/SimpleCycles.cs            |  35 +-
 .../Integration/Hybrid/ParallelHybridTest.cs  | 107 +++---
 .../ShiftStrategy/ShiftStrategyTest.cs        |  23 +-
 VectoCore/VectoCoreTest/Utils/GraphWriter.cs  |  36 +-
 8 files changed, 338 insertions(+), 310 deletions(-)

diff --git a/Tools/GraphDrawer/Program.cs b/Tools/GraphDrawer/Program.cs
index 5224f7d245..1423ca6b38 100644
--- a/Tools/GraphDrawer/Program.cs
+++ b/Tools/GraphDrawer/Program.cs
@@ -29,42 +29,43 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.Linq;
-using TUGraz.VectoCore.Tests.Utils;
-
-namespace GraphDrawer
-{
-    internal class Program
-    {
-        private const string HELP = @"
-Tool for plotting graphs comparing Vecto 2.2 and Vecto 3
-
---split <leng> ... split input into parts of length <len> (in m), only distance output
-
-";
-
-        private static void Main(string[] args)
-        {
-            if (args.Contains("--split")) {
+using System;
+using System.Linq;
+using TUGraz.VectoCore.Tests.Utils;
+
+namespace GraphDrawer
+{
+    internal class Program
+    {
+        private const string HELP = @"
+Tool for plotting graphs comparing Vecto 2.2 and Vecto 3
+
+--split <leng> ... split input into parts of length <len> (in m), only distance output
+
+";
+
+        private static void Main(string[] args)
+        {
+			var graphWriter = new GraphWriter();
+            if (args.Contains("--split")) {
 				Console.Error.WriteLine("plotting graphs splitted by distance");
-                var idx = Array.FindIndex(args, x => x == "--split");
-                var lenght = int.Parse(args[idx + 1]);
-                var success = true;
-                var start = 0;
-                do {
+                var idx = Array.FindIndex(args, x => x == "--split");
+                var lenght = int.Parse(args[idx + 1]);
+                var success = true;
+                var start = 0;
+                do {
 					Console.Error.WriteLine("plotting {0} - {1}", start / 1000, (start + lenght) / 1000);
-                    success = GraphWriter.WriteDistanceSlice(args[0], args[1], start, start + lenght);
-                    start += lenght;
-                } while (success);
+					success = graphWriter.WriteDistanceSlice(args[0], args[1], start, start + lenght);
+                    start += lenght;
+                } while (success);
 				Console.Error.WriteLine("plotting full cycle");
-                GraphWriter.Write(args[0], args[1]);
+                graphWriter.Write(args[0], args[1]);
 				Console.Error.WriteLine("done");
-                return;
-            }
+                return;
+            }
 			Console.Error.WriteLine("plotting graphs...");
-            GraphWriter.Write(args[0], args[1]);
+            graphWriter.Write(args[0], args[1]);
 			Console.Error.WriteLine("done");
-        }
-    }
+        }
+    }
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTests.cs b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTests.cs
index 4df0e4b5ab..c462bf4595 100644
--- a/VectoCore/VectoCoreTest/Integration/ADAS/ADASTests.cs
+++ b/VectoCore/VectoCoreTest/Integration/ADAS/ADASTests.cs
@@ -32,25 +32,25 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 
 			_kernel = new StandardKernel(new VectoNinjectModule());
 			xmlInputReader = _kernel.Get<IXMLInputDataReader>();
-
-			InitGraphWriter();
 		}
 
-		private void InitGraphWriter()
+		private GraphWriter  GetGraphWriter()
 		{
+			var graphWriter = new GraphWriter();
 			//#if TRACE
-			GraphWriter.Enable();
+			graphWriter.Enable();
 			//#else
-			//GraphWriter.Disable();
+			//graphWriter.Disable();
 			//#endif
-			GraphWriter.Xfields = new[] { ModalResultField.dist };
+			graphWriter.Xfields = new[] { ModalResultField.dist };
 
-			GraphWriter.Yfields = new[] {
+			graphWriter.Yfields = new[] {
 				ModalResultField.v_act, ModalResultField.altitude, ModalResultField.acc, ModalResultField.Gear,
 				ModalResultField.P_ice_out, ModalResultField.FCMap
 			};
-			GraphWriter.Series1Label = "ADAS PCC";
-			GraphWriter.PlotIgnitionState = true;
+			graphWriter.Series1Label = "ADAS PCC";
+			graphWriter.PlotIgnitionState = true;
+			return graphWriter;
 		}
 
 
@@ -113,7 +113,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			var progress = jobContainer.GetProgress();
 			Assert.IsTrue(progress.All(r => r.Value.Success), string.Concat<Exception>(progress.Select(r => r.Value.Error)));
 			var modFilename = writer.GetModDataFileName(run.RunName, run.CycleName, run.RunSuffix);
-			GraphWriter.Write(modFilename);
+			GetGraphWriter().Write(modFilename);
 		}
 
 		[TestCase(0, TestName = "AT EcoRoll Neutral DH1.8 const"),
@@ -154,7 +154,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			var progress = jobContainer.GetProgress();
 			Assert.IsTrue(progress.All(r => r.Value.Success), string.Concat<Exception>(progress.Select(r => r.Value.Error)));
 			var modFilename = writer.GetModDataFileName(run.RunName, run.CycleName, run.RunSuffix);
-			GraphWriter.Write(modFilename);
+			GetGraphWriter().Write(modFilename);
 		}
 
 
@@ -195,7 +195,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			var progress = jobContainer.GetProgress();
 			Assert.IsTrue(progress.All(r => r.Value.Success), string.Concat<Exception>(progress.Select(r => r.Value.Error)));
 			var modFilename = writer.GetModDataFileName(run.RunName, run.CycleName, run.RunSuffix);
-			GraphWriter.Write(modFilename);
+			GetGraphWriter().Write(modFilename);
 		}
 
 		[TestCase(@"TestData\Integration\ADAS\Group9_AT_EngineStopStart.xml")]
@@ -289,7 +289,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ADAS
 			var progress = jobContainer.GetProgress();
 			Assert.IsTrue(progress.All(r => r.Value.Success), string.Concat<Exception>(progress.Select(r => r.Value.Error)));
 			var modFilename = writer.GetModDataFileName(run.RunName, run.CycleName, run.RunSuffix);
-			GraphWriter.Write(modFilename);
+			GetGraphWriter().Write(modFilename);
 		}
 
 
diff --git a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs
index cddffae2be..2069c8a9f7 100644
--- a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs
@@ -29,12 +29,13 @@ using ElectricSystem = TUGraz.VectoCore.Models.SimulationComponent.ElectricSyste
 namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 {
 	[TestFixture]
+	[Parallelizable(ParallelScope.All)]
 	public class BatteryElectricTest
 	{
 
 
 
-		private ModalResultField[] Yfields;
+		//private ModalResultField[] Yfields;
 		public const string MotorFile = @"TestData\BatteryElectric\GenericVehicleB4\GenericEMotor_125kW_485Nm.vem";
 		public const string BatFile = @"TestData\BatteryElectric\GenericVehicleB4\GenericBattery_243kWh_750V.vbat";
 
@@ -48,27 +49,30 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 		public void RunBeforeAnyTests()
 		{
 			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
-
-			InitGraphWriter();
 		}
 
 
-		private void InitGraphWriter()
+		private GraphWriter GetGraphWriter(ModalResultField[] yFields)
 		{
+			var graphWriter = new GraphWriter();
 			//#if TRACE
-			GraphWriter.Enable();
+			graphWriter.Enable();
 
 			//#else
 			//GraphWriter.Disable();
 			//#endif
-			GraphWriter.Xfields = new[] { ModalResultField.dist };
+			
 
-			Yfields = new[] {
+			var Yfields = new[] {
 				ModalResultField.v_act, ModalResultField.altitude, ModalResultField.acc, ModalResultField.Gear,
 				ModalResultField.BatterySOC,
-			};
-			GraphWriter.Series1Label = "Hybrid";
-			GraphWriter.PlotIgnitionState = true;
+			}.Concat(yFields).ToArray();
+			graphWriter.Xfields = new[] { ModalResultField.dist };
+			graphWriter.Yfields = yFields;
+			graphWriter.Series1Label = "BEV";
+			graphWriter.PlotIgnitionState = true;
+
+			return graphWriter;
 		}
 
 
@@ -94,8 +98,6 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 		] // the vehicle can drive max. 56km/h!! 80km/h testcase makes no sense
 		public void B4BEVConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B4 }).ToArray();
-
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
 				  7000, {0}, {1},    0", vmax, slope);
@@ -108,7 +110,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 			var job = CreateEngineeringRun(
 				cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl);
 			var run = job.Runs.First().Run;
-            var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
+			var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
 
 			var data = run.GetContainer().RunData;
 			//File.WriteAllText(
@@ -119,7 +121,9 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_B4 });
+			graphWriter.Write(modFilename);
 		}
 
 
@@ -130,7 +134,6 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 		]
 		public void B4BEVDriveOff(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B4 }).ToArray();
 			var cycleData = string.Format(
 				@"   0,   0, {1},    3
 				   700, {0}, {1},    0", vmax, slope);
@@ -143,194 +146,195 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 			var job = CreateEngineeringRun(
 				cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true);
 			var run = job.Runs.First().Run;
-            var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
+			var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
 
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_B4 });
+			graphWriter.Write(modFilename);
 		}
 
-        [
-            TestCase("LongHaul", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle LongHaul, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("RegionalDelivery", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle RegionalDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("UrbanDelivery", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle UrbanDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Construction", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Construction, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Urban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Urban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Suburban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle SubUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Interurban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle InterUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Coach", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Coach, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-        ]
-        public void B4BEVDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
-        {
-            GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B4 }).ToArray();
-
-            var cycleData = RessourceHelper.ReadStream(
-                DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
-                declarationMission +
-                Constants.FileExtensions.CycleFile);
-            var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false);
-
-            const bool largeMotor = true;
-
-            var modFilename = string.Format("SimpleParallelHybrid-B4_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl);
-            const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4;
+		[
+			TestCase("LongHaul", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle LongHaul, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("RegionalDelivery", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle RegionalDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("UrbanDelivery", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle UrbanDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Construction", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Construction, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Urban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Urban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Suburban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle SubUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Interurban", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle InterUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Coach", 2000, 0.8, 0, TestName = "B4 BEV DriveCycle Coach, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+		]
+		public void B4BEVDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
+		{
+			var cycleData = RessourceHelper.ReadStream(
+				DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
+				declarationMission +
+				Constants.FileExtensions.CycleFile);
+			var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false);
+
+			const bool largeMotor = true;
+
+			var modFilename = string.Format("SimpleParallelHybrid-B4_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl);
+			const PowertrainPosition pos = PowertrainPosition.BatteryElectricB4;
 			var job = CreateEngineeringRun(
 				cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true);
 			var run = job.Runs.First().Run;
-            var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
+			var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
 
-            //var data = run.GetContainer().RunData;
-            //File.WriteAllText(
-            //	$"{modFilename}.json",
-            //	JsonConvert.SerializeObject(data, Formatting.Indented));
+			//var data = run.GetContainer().RunData;
+			//File.WriteAllText(
+			//	$"{modFilename}.json",
+			//	JsonConvert.SerializeObject(data, Formatting.Indented));
 
-            //run.Run();
+			//run.Run();
 			job.Execute();
 			job.WaitFinished();
-            Assert.IsTrue(run.FinishedWithoutErrors);
+			Assert.IsTrue(run.FinishedWithoutErrors);
 			Assert.IsTrue(modData.Rows.Count > 0);
 
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_B4 });
+			graphWriter.Write(modFilename + ".vmod");
+		}
 
-            GraphWriter.Write(modFilename + ".vmod");
-        }
-
-        // - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - -  - - - 
-
-        [
-            TestCase(30, 0.7, 0, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.7, level"),
-            TestCase(50, 0.7, 0, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.7, level"),
-            //TestCase(80, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.7, level"),
+		// - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - -  - - - 
 
-            TestCase(30, 0.25, 0, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level"),
-            TestCase(50, 0.25, 0, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.25, level"),
-            //TestCase(80, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.25, level"),
+		[
+			TestCase(30, 0.7, 0, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.7, level"),
+			TestCase(50, 0.7, 0, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.7, level"),
+			//TestCase(80, 0.7, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.7, level"),
 
-            TestCase(30, 0.5, 5, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.5, UH 5%"),
-            TestCase(50, 0.5, 5, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.5, UH 5%"),
-            //TestCase(80, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, UH 5%"),
+			TestCase(30, 0.25, 0, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level"),
+			TestCase(50, 0.25, 0, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.25, level"),
+			//TestCase(80, 0.25, 0, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.25, level"),
 
-            TestCase(30, 0.5, -5, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.5, DH 5%"),
-            TestCase(50, 0.5, -5, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.5, DH 5%"),
-            //TestCase(80, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, DH 5%"),
+			TestCase(30, 0.5, 5, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.5, UH 5%"),
+			TestCase(50, 0.5, 5, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.5, UH 5%"),
+			//TestCase(80, 0.5, 5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, UH 5%"),
 
-            TestCase(30, 0.25, 0, 1000, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 1kW"),
-            TestCase(30, 0.25, 0, 5000, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 5kW"),
-        ] // the vehicle can drive max. 56km/h!! 80km/h testcase makes no sense
-        public void B3BEVConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl)
-        {
-            GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B3 }).ToArray();
+			TestCase(30, 0.5, -5, 0, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.5, DH 5%"),
+			TestCase(50, 0.5, -5, 0, TestName = "B3 BEV ConstantSpeed 50km/h SoC: 0.5, DH 5%"),
+			//TestCase(80, 0.5, -5, 0, TestName = "B4 BEV ConstantSpeed 80km/h SoC: 0.5, DH 5%"),
 
-            var cycleData = string.Format(
-                @"   0, {0}, {1},    0
+			TestCase(30, 0.25, 0, 1000, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 1kW"),
+			TestCase(30, 0.25, 0, 5000, TestName = "B3 BEV ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 5kW"),
+		] // the vehicle can drive max. 56km/h!! 80km/h testcase makes no sense
+		public void B3BEVConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl)
+		{
+			var cycleData = string.Format(
+				@"   0, {0}, {1},    0
 				  7000, {0}, {1},    0", vmax, slope);
-            var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
+			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
 
-            const bool largeMotor = true;
+			const bool largeMotor = true;
 
-            var modFilename = string.Format("SimpleBatteryElectric-B3_constant_{0}-{1}_{2}_{3}", vmax, initialSoC, slope, pAuxEl);
-            const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3;
-            var job = CreateEngineeringRun(
-                cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl);
+			var modFilename = string.Format("SimpleBatteryElectric-B3_constant_{0}-{1}_{2}_{3}", vmax, initialSoC, slope, pAuxEl);
+			const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3;
+			var job = CreateEngineeringRun(
+				cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true, pAuxEl: pAuxEl);
 			var run = job.Runs.First().Run;
-            var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
-
-            var data = run.GetContainer().RunData;
-            //File.WriteAllText(
-            //	$"{modFilename}.json",
-            //	JsonConvert.SerializeObject(data, Formatting.Indented));
-
-            run.Run();
-            Assert.IsTrue(run.FinishedWithoutErrors);
-
-            Assert.IsTrue(modData.Rows.Count > 0);
-            GraphWriter.Write(modFilename + ".vmod");
-        }
-
-
-        [
-            TestCase(30, 0.7, 0, TestName = "B3 BEV DriveOff 30km/h SoC: 0.7, level"),
-            TestCase(80, 0.7, 0, TestName = "B3 BEV DriveOff 80km/h SoC: 0.7, level"),
-            TestCase(30, 0.25, 0, TestName = "B3 BEV DriveOff 30km/h SoC: 0.25, level")
-        ]
-        public void B3BEVDriveOff(double vmax, double initialSoC, double slope)
-        {
-            GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B3 }).ToArray();
-            var cycleData = string.Format(
-                @"   0,   0, {1},    3
+			var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
+
+			var data = run.GetContainer().RunData;
+			//File.WriteAllText(
+			//	$"{modFilename}.json",
+			//	JsonConvert.SerializeObject(data, Formatting.Indented));
+
+			run.Run();
+			Assert.IsTrue(run.FinishedWithoutErrors);
+
+			Assert.IsTrue(modData.Rows.Count > 0);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_B3 });
+			graphWriter.Write(modFilename + ".vmod");
+		}
+
+
+		[
+			TestCase(30, 0.7, 0, TestName = "B3 BEV DriveOff 30km/h SoC: 0.7, level"),
+			TestCase(80, 0.7, 0, TestName = "B3 BEV DriveOff 80km/h SoC: 0.7, level"),
+			TestCase(30, 0.25, 0, TestName = "B3 BEV DriveOff 30km/h SoC: 0.25, level")
+		]
+		public void B3BEVDriveOff(double vmax, double initialSoC, double slope)
+		{
+			var cycleData = string.Format(
+				@"   0,   0, {1},    3
 				   700, {0}, {1},    0", vmax, slope);
-            var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
+			var cycle = SimpleDrivingCycles.CreateCycleData(cycleData);
 
-            const bool largeMotor = true;
+			const bool largeMotor = true;
 
-            var modFilename = string.Format("SimpleBatteryElectric-B3_acc_{0}-{1}_{2}", vmax, initialSoC, slope);
-            const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3;
-            var job = CreateEngineeringRun(
-                cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true);
+			var modFilename = string.Format("SimpleBatteryElectric-B3_acc_{0}-{1}_{2}", vmax, initialSoC, slope);
+			const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3;
+			var job = CreateEngineeringRun(
+				cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true);
 			var run = job.Runs.First().Run;
-            var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
-
-            run.Run();
-            Assert.IsTrue(run.FinishedWithoutErrors);
-
-            Assert.IsTrue(modData.Rows.Count > 0);
-            GraphWriter.Write(modFilename + ".vmod");
-        }
-
-        [
-            TestCase("LongHaul", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle LongHaul, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("RegionalDelivery", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle RegionalDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("UrbanDelivery", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle UrbanDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Construction", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Construction, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Urban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Urban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Suburban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle SubUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Interurban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle InterUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-            TestCase("Coach", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Coach, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
-        ]
-        public void B3BEVDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
-        {
-            GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_B3 }).ToArray();
-
-            var cycleData = RessourceHelper.ReadStream(
-                DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
-                declarationMission +
-                Constants.FileExtensions.CycleFile);
-            var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false);
-
-            const bool largeMotor = true;
-
-            var modFilename = string.Format("SimpleParallelHybrid-B3_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl);
+			var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
+
+			run.Run();
+			Assert.IsTrue(run.FinishedWithoutErrors);
+
+			Assert.IsTrue(modData.Rows.Count > 0);
+			
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_B3 });
+			graphWriter.Write(modFilename + ".vmod");
+		}
+
+		[
+			TestCase("LongHaul", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle LongHaul, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("RegionalDelivery", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle RegionalDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("UrbanDelivery", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle UrbanDelivery, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Construction", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Construction, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Urban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Urban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Suburban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle SubUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Interurban", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle InterUrban, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+			TestCase("Coach", 2000, 0.8, 0, TestName = "B3 Hybrid DriveCycle Coach, SoC: 0.8 Payload: 2t P_auxEl: 0kW"),
+		]
+		public void B3BEVDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
+		{
+			var cycleData = RessourceHelper.ReadStream(
+				DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
+				declarationMission +
+				Constants.FileExtensions.CycleFile);
+			var cycle = DrivingCycleDataReader.ReadFromStream(cycleData, CycleType.DistanceBased, "", false);
+
+			const bool largeMotor = true;
+
+			var modFilename = string.Format("SimpleParallelHybrid-B3_cycle_{0}-{1}_{2}_{3}", declarationMission, initialSoC, payload, pAuxEl);
 			const PowertrainPosition pos = PowertrainPosition.BatteryElectricB3;
-            var job = CreateEngineeringRun(
-                cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true);
+			var job = CreateEngineeringRun(
+				cycle, modFilename, initialSoC, pos, 2, 22.6, largeMotor: true);
 
 			var run = job.Runs.First().Run;
-            var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
+			var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data;
 
-            var data = run.GetContainer().RunData;
-            //File.WriteAllText(
-            //	$"{modFilename}.json",
-            //	JsonConvert.SerializeObject(data, Formatting.Indented));
+			var data = run.GetContainer().RunData;
+			//File.WriteAllText(
+			//	$"{modFilename}.json",
+			//	JsonConvert.SerializeObject(data, Formatting.Indented));
 
-            //run.Run();
+			//run.Run();
 			job.Execute();
 			job.WaitFinished();
 			Assert.IsTrue(run.FinishedWithoutErrors);
-            Assert.IsTrue(modData.Rows.Count > 0);
-            GraphWriter.Write(modFilename + ".vmod");
-        }
+			Assert.IsTrue(modData.Rows.Count > 0);
+			
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_B3 });
+			graphWriter.Write(modFilename + ".vmod");
+		}
 
 
-        // =================================================
+		// =================================================
 
 
-        public static JobContainer CreateEngineeringRun(
+		public static JobContainer CreateEngineeringRun(
 			DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, int count, double ratio, bool largeMotor = false, double pAuxEl = 0, Kilogram payload = null)
 		{
 			var fileWriter = new FileOutputWriter(Path.GetFileNameWithoutExtension(modFileName));
 			var sumData = new SummaryDataContainer(fileWriter);
-            var jobContainer = new JobContainer(sumData);
+			var jobContainer = new JobContainer(sumData);
 			var container = CreateBatteryElectricPowerTrain(
 				cycleData, modFileName, fileWriter, sumData, initialSoc, count, ratio, largeMotor,  pAuxEl, pos, payload);
 			
@@ -389,7 +393,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 			{
 				WriteModalResults = true,
 			};
-            if (pos == PowertrainPosition.BatteryElectricB3) {
+			if (pos == PowertrainPosition.BatteryElectricB3) {
 				runData.AxleGearData = axleGearData;
 			}
 
@@ -403,7 +407,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 			
 			container.RunData = runData;
 			
-            var es = new ElectricSystem(container);
+			var es = new ElectricSystem(container);
 			var battery = new Battery(container, batteryData);
 			battery.Initialize(initialBatCharge);
 
@@ -436,10 +440,10 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 				case PowertrainPosition.BatteryElectricB4:
 					powertrain.AddComponent(
 						GetElectricMachine(PowertrainPosition.BatteryElectricB4, runData.ElectricMachinesData, container, es, ctl));
-                    new DummyGearboxInfo(container);
-                    //new MockEngineInfo(container);
-                    new ATClutchInfo(container);
-                    break;
+					new DummyGearboxInfo(container);
+					//new MockEngineInfo(container);
+					new ATClutchInfo(container);
+					break;
 				case PowertrainPosition.BatteryElectricB3:
 					powertrain.AddComponent(new AxleGear(container, runData.AxleGearData))
 							.AddComponent(
@@ -447,7 +451,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric
 					new DummyGearboxInfo(container);
 					//new MockEngineInfo(container);
 					new ATClutchInfo(container);
-                    break;
+					break;
 				case PowertrainPosition.BatteryElectricB2:
 					throw new VectoException("Battery Electric configuration B2 currently not supported");
 				default: throw new ArgumentOutOfRangeException(nameof(pos), pos, null);
diff --git a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AAuxTests.cs b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AAuxTests.cs
index b28b0bde33..fee705e775 100644
--- a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AAuxTests.cs
+++ b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AAuxTests.cs
@@ -46,22 +46,28 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries
 		public void Init()
 		{
 			//LogManager.DisableLogging();
+			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
+		}
+
+		private GraphWriter getGraphWriter() 
+		{
+			var graphWriter = new GraphWriter();
 #if TRACE
-			GraphWriter.Enable();
+			graphWriter.Enable();
 #else
-			GraphWriter.Disable();
+			graphWriter.Disable();
 #endif
-			GraphWriter.Xfields = new[] { ModalResultField.time, ModalResultField.dist };
+			graphWriter.Xfields = new[] { ModalResultField.time, ModalResultField.dist };
 
-			GraphWriter.Yfields = new[] {
+			graphWriter.Yfields = new[] {
 				ModalResultField.v_act, ModalResultField.acc, ModalResultField.n_ice_avg, ModalResultField.Gear,
 				ModalResultField.P_ice_out, ModalResultField.T_ice_fcmap, ModalResultField.FCMap
 			};
-			GraphWriter.Series1Label = "Vecto 3";
-			GraphWriter.Series2Label = "Vecto 2.0_aux";
+			graphWriter.Series1Label = "Vecto 3";
+			graphWriter.Series2Label = "Vecto 2.0_aux";
 
-			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
-	}
+			return graphWriter;
+		}
 
 		private static string GetSlopeString(double slope)
 		{
@@ -303,7 +309,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
-			GraphWriter.Write(modFileName, @"..\..\TestData\Integration\BusAuxiliaries\Vecto2.0\" + compareFileName);
+			getGraphWriter().Write(modFileName, @"..\..\TestData\Integration\BusAuxiliaries\Vecto2.0\" + compareFileName);
 		}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCoreTest/Integration/DriverStrategy/SimpleCycles.cs b/VectoCore/VectoCoreTest/Integration/DriverStrategy/SimpleCycles.cs
index 696d5010ad..f1b3a9ae53 100644
--- a/VectoCore/VectoCoreTest/Integration/DriverStrategy/SimpleCycles.cs
+++ b/VectoCore/VectoCoreTest/Integration/DriverStrategy/SimpleCycles.cs
@@ -46,23 +46,28 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 		[OneTimeSetUp]
 		public void Init()
 		{
+			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
 			//LogManager.DisableLogging();
+		}
+
+		public GraphWriter GetGraphWriter()
+		{
+			var graphWriter = new GraphWriter();
 #if TRACE
-			GraphWriter.Enable();
+			graphWriter.Enable();
 #else
-			GraphWriter.Disable();
+			graphWriter.Disable();
 #endif
-			GraphWriter.Xfields = new[] { ModalResultField.time, ModalResultField.dist };
+			graphWriter.Xfields = new[] { ModalResultField.time, ModalResultField.dist };
 
-			GraphWriter.Yfields = new[] {
+			graphWriter.Yfields = new[] {
 				ModalResultField.v_act, ModalResultField.acc, ModalResultField.n_ice_avg, ModalResultField.Gear,
 				ModalResultField.P_ice_out, ModalResultField.T_ice_fcmap, ModalResultField.FCMap
 			};
-			GraphWriter.Series1Label = "Vecto 3";
-			GraphWriter.Series2Label = "Vecto 2.2";
-
-			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
-	}
+			graphWriter.Series1Label = "Vecto 3";
+			graphWriter.Series2Label = "Vecto 2.2";
+			return graphWriter;
+		}
 
 		private static string GetSlopeString(double slope)
 		{
@@ -81,7 +86,7 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 			var imgv22 =
 				@"TestData\Results\Integration\40t_Long_Haul_Truck_Cycle_Drive_50_Dec_Increasing_Slope_v22.vmod";
 
-			GraphWriter.Write(imgV3, imgv22);
+			GetGraphWriter().Write(imgV3, imgv22);
 		}
 
 		[TestCase, Category("ComparisonV2")]
@@ -89,7 +94,7 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 		{
 			var imgV3 = @"TestData\Results\Integration\40t_Long_Haul_Truck_Cycle_Drive_50_Dec_Increasing_Slope_v3.vmod";
 
-			GraphWriter.Write(imgV3);
+			GetGraphWriter().Write(imgV3);
 		}
 
 		[Category("ComparisonV2"),
@@ -255,7 +260,7 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
-			GraphWriter.Write(modFileName,
+			GetGraphWriter().Write(modFileName,
 				@"..\..\TestData\Integration\DriverStrategy\Vecto2.2\40t Truck\" + modFileName);
 		}
 
@@ -285,7 +290,7 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
-			GraphWriter.Write(modFileName,
+			GetGraphWriter().Write(modFileName,
 				@"..\..\TestData\Integration\DriverStrategy\Vecto2.2\40t Truck_Overspeed\" + modFileName);
 		}
 
@@ -444,7 +449,7 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
-			GraphWriter.Write(modFileName, @"..\..\TestData\Integration\DriverStrategy\Vecto2.2\Coach\" + modFileName);
+			GetGraphWriter().Write(modFileName, @"..\..\TestData\Integration\DriverStrategy\Vecto2.2\Coach\" + modFileName);
 		}
 
 		[Category("ComparisonV2"),
@@ -473,7 +478,7 @@ namespace TUGraz.VectoCore.Tests.Integration.DriverStrategy
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
-			GraphWriter.Write(modFileName,
+			GetGraphWriter().Write(modFileName,
 				@"..\..\TestData\Integration\DriverStrategy\Vecto2.2\Coach_Overspeed\" + modFileName);
 		}
 
diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs
index b5ca9a8fc8..61b6f783aa 100644
--- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs
@@ -31,9 +31,10 @@ using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels;
 namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 {
 	[TestFixture]
+	[Parallelizable(ParallelScope.All)]
 	public class ParallelHybridTest
 	{
-		private ModalResultField[] Yfields;
+		//private ModalResultField[] Yfields;
 		public const string MotorFile = @"TestData\Hybrids\ElectricMotor\GenericEMotor.vem";
 		public const string BatFile = @"TestData\Hybrids\Battery\GenericBattery.vbat";
 
@@ -43,30 +44,39 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		public const string GearboxIndirectLoss = @"TestData\Components\Indirect Gear.vtlm";
 		public const string GearboxDirectLoss = @"TestData\Components\Direct Gear.vtlm";
 
+
+		public const bool PlotGraphs = true;
+
 		[OneTimeSetUp]
 		public void RunBeforeAnyTests()
 		{
 			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
 
-			InitGraphWriter();
+
+			//InitGraphWriter();
 		}
 
 
-		private void InitGraphWriter()
+		private GraphWriter GetGraphWriter(ModalResultField[] emYFields)
 		{
-			//#if TRACE
-			GraphWriter.Enable();
-			//#else
-			//GraphWriter.Disable();
-			//#endif
-			GraphWriter.Xfields = new[] { ModalResultField.dist };
-
-			Yfields = new[] {
+			var Yfields = new[] {
 				ModalResultField.v_act, ModalResultField.altitude, ModalResultField.acc, ModalResultField.Gear,
 				ModalResultField.P_ice_out, ModalResultField.BatterySOC, ModalResultField.FCMap
-			};
-			GraphWriter.Series1Label = "Hybrid";
-			GraphWriter.PlotIgnitionState = true;
+			}.Concat(emYFields).ToArray();
+
+			var graphWriter = new GraphWriter();
+			graphWriter.Xfields = new[] { ModalResultField.dist };
+			graphWriter.Yfields = Yfields;
+			graphWriter.Series1Label = "Hybrid";
+			graphWriter.PlotIgnitionState = true;
+
+			if (PlotGraphs) {
+				graphWriter.Enable();
+			} else {
+				graphWriter.Disable();
+			}
+
+			return graphWriter;
 		}
 		
 
@@ -77,7 +87,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			]
 		public void P2HybridDriveOff(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P2 }).ToArray();
+			var GraphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 });
 			var cycleData = string.Format(
 				@"   0,   0, {1},    3
 				   700, {0}, {1},    0", vmax, slope);
@@ -127,8 +137,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P2HybridConstantSpeed(double vmax, double initialSoC, double slope, double  pAuxEl)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P2 }).ToArray();
-
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
 				  7000, {0}, {1},    0", vmax, slope);
@@ -156,7 +164,8 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 });
+			graphWriter.Write(modFilename);
 		}
 
 		[
@@ -180,8 +189,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P2HybriDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P2 }).ToArray();
-
 			var cycleData = RessourceHelper.ReadStream(
 				DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
 				declarationMission +
@@ -211,7 +218,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			job.Execute();
 			job.WaitFinished();
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 });
+			graphWriter.Write(modFilename);
 		}
 
 
@@ -293,9 +302,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P2HybridBrakeStandstill(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P2 }).ToArray();
-
-			//var dst =
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
 				   200,   0, {1},    3", vmax, slope);
@@ -320,7 +326,8 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 });
+			graphWriter.Write(modFilename);
 		}
 
 		// - - - - - - - - - - - - - - - - - - - - - - - - - 
@@ -348,8 +355,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P3HybridConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P3 }).ToArray();
-
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
 				  7000, {0}, {1},    0", vmax, slope);
@@ -377,7 +382,8 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P3 });
+			graphWriter.Write(modFilename);
 		}
 
 		[
@@ -387,8 +393,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P3HybridDriveOff(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P3 }).ToArray();
-
 			var cycleData = string.Format(
 				@"   0,   0, {1},    3
 				   700, {0}, {1},    0", vmax, slope);
@@ -411,7 +415,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+			
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P3 });
+			graphWriter.Write(modFilename);
 		}
 
 		[TestCase(50, 0.79, 0, TestName = "P3 Hybrid Brake Standstill 50km/h SoC: 0.79, level"),
@@ -420,8 +426,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P3HybridBrakeStandstill(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P3 }).ToArray();
-
 			//var dst =
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
@@ -447,7 +451,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P3 });
+			graphWriter.Write(modFilename);
 		}
 
 
@@ -463,8 +469,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P3HybriDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P3 }).ToArray();
-
 			var cycleData = RessourceHelper.ReadStream(
 				DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
 				declarationMission +
@@ -493,7 +497,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P3 });
+			graphWriter.Write(modFilename);
 		}
 
 		// - - - - - - - - - - - - - - - - - - - - - - - - - 
@@ -520,8 +526,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P4HybridConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P4 }).ToArray();
-
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
 				  7000, {0}, {1},    0", vmax, slope);
@@ -549,7 +553,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P3 });
+			graphWriter.Write(modFilename);
 		}
 
 		[
@@ -559,8 +565,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P4HybridDriveOff(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P4 }).ToArray();
-
 			var cycleData = string.Format(
 				@"   0,   0, {1},    3
 				   700, {0}, {1},    0", vmax, slope);
@@ -583,7 +587,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P4 });
+			graphWriter.Write(modFilename);
 		}
 
 		[TestCase(50, 0.79, 0, TestName = "P4 Hybrid Brake Standstill 50km/h SoC: 0.79, level"),
@@ -592,9 +598,6 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 		]
 		public void P4HybridBrakeStandstill(double vmax, double initialSoC, double slope)
 		{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P4 }).ToArray();
-
-			//var dst =
 			var cycleData = string.Format(
 				@"   0, {0}, {1},    0
 				   200,   0, {1},    3", vmax, slope);
@@ -619,7 +622,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+			
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P4 });
+			graphWriter.Write(modFilename);
 		}
 
 		[
@@ -633,9 +638,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			TestCase("Coach", 2000, 0.5, 0, TestName = "P4 Hybrid DriveCycle Coach, SoC: 0.5 Payload: 2t P_auxEl: 0kW"),
 		]
 		public void P4HybriDriveCycle(string declarationMission, double payload, double initialSoC, double pAuxEl)
-	{
-			GraphWriter.Yfields = Yfields.Concat(new[] { ModalResultField.P_electricMotor_mech_P4 }).ToArray();
-
+		{
 			var cycleData = RessourceHelper.ReadStream(
 				DeclarationData.DeclarationDataResourcePrefix + ".MissionCycles." +
 				declarationMission +
@@ -664,7 +667,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
 			Assert.IsTrue(modData.Rows.Count > 0);
-			GraphWriter.Write(modFilename);
+			
+			var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P4 });
+			graphWriter.Write(modFilename);
 		}
 
 		// =================================================
diff --git a/VectoCore/VectoCoreTest/Integration/ShiftStrategy/ShiftStrategyTest.cs b/VectoCore/VectoCoreTest/Integration/ShiftStrategy/ShiftStrategyTest.cs
index ccc8b3302b..b158792d58 100644
--- a/VectoCore/VectoCoreTest/Integration/ShiftStrategy/ShiftStrategyTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/ShiftStrategy/ShiftStrategyTest.cs
@@ -53,25 +53,32 @@ namespace TUGraz.VectoCore.Tests.Integration.ShiftStrategy
 	public class ShiftStrategyTest
 	{
 		[OneTimeSetUp]
-		public void DisableLogging()
+		public void RunBeforeAnyTests()
 		{
 			Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
+		}
+
+
+		public GraphWriter GetGraphWriter()
+		{
+			var graphWriter = new GraphWriter();
 
 			//LogManager.DisableLogging();
 #if TRACE
-			GraphWriter.Enable();
+			graphWriter.Enable();
 #else
-			GraphWriter.Disable();
+			graphWriter.Disable();
 #endif
 
-			GraphWriter.Xfields = new[] { ModalResultField.dist };
+			graphWriter.Xfields = new[] { ModalResultField.dist };
 
-			GraphWriter.Yfields = new[] {
+			graphWriter.Yfields = new[] {
 				ModalResultField.v_act, ModalResultField.acc, ModalResultField.n_ice_avg, ModalResultField.Gear,
 				ModalResultField.P_ice_out, /*ModalResultField.T_eng_fcmap, */ ModalResultField.FCMap,
 			};
-			GraphWriter.PlotDrivingMode = true;
-			GraphWriter.Series1Label = "Vecto 3";
+			graphWriter.PlotDrivingMode = true;
+			graphWriter.Series1Label = "Vecto 3";
+			return graphWriter;
 		}
 
 		[Test,
@@ -103,7 +110,7 @@ namespace TUGraz.VectoCore.Tests.Integration.ShiftStrategy
 			run.Run();
 			Assert.IsTrue(run.FinishedWithoutErrors);
 
-			GraphWriter.Write(modFile);
+			GetGraphWriter().Write(modFile);
 		}
 
 		[TestCase()]
diff --git a/VectoCore/VectoCoreTest/Utils/GraphWriter.cs b/VectoCore/VectoCoreTest/Utils/GraphWriter.cs
index 765794d086..d0eacf9529 100644
--- a/VectoCore/VectoCoreTest/Utils/GraphWriter.cs
+++ b/VectoCore/VectoCoreTest/Utils/GraphWriter.cs
@@ -45,39 +45,39 @@ using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Tests.Utils
 {
-	public static class GraphWriter
+	public class GraphWriter
 	{
-		private static bool _enabled = true;
+		private bool _enabled = true;
 
-		private static Size _diagramSize = new Size(2000, 440);
+		private Size _diagramSize = new Size(2000, 440);
 
-		private static readonly Font AxisLabelFont = new Font("Consolas", 10);
-		private static readonly Font AxisTitleFont = new Font("Verdana", 12);
-		private static readonly Font LegendFont = new Font("Verdana", 14);
+		private readonly Font AxisLabelFont = new Font("Consolas", 10);
+		private readonly Font AxisTitleFont = new Font("Verdana", 12);
+		private readonly Font LegendFont = new Font("Verdana", 14);
 
-		public static string Series2Label { get; set; }
+		public string Series2Label { get; set; }
 
-		public static string Series1Label { get; set; }
+		public string Series1Label { get; set; }
 
-		public static ModalResultField[] Yfields { get; set; }
+		public ModalResultField[] Yfields { get; set; }
 
-		public static ModalResultField[] Xfields { get; set; }
+		public ModalResultField[] Xfields { get; set; }
 
-		public static bool PlotDrivingMode = false;
+		public bool PlotDrivingMode = false;
 
-		public static bool PlotIgnitionState = false;
+		public bool PlotIgnitionState = false;
 
-		public static void Enable()
+		public void Enable()
 		{
 			_enabled = true;
 		}
 
-		public static void Disable()
+		public  void Disable()
 		{
 			_enabled = false;
 		}
 
-		public static void Write(string fileNameV3, string fileNameV22 = null)
+		public  void Write(string fileNameV3, string fileNameV22 = null)
 		{
 			if (!_enabled) {
 				return;
@@ -230,7 +230,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 			}
 		}
 
-		public static bool WriteDistanceSlice(string fileNameV3, string fileNameV22, double start, double end)
+		public bool WriteDistanceSlice(string fileNameV3, string fileNameV22, double start, double end)
 		{
 			if (!_enabled) {
 				return true;
@@ -395,7 +395,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 			chartArea.Position.Y = (i * (100.0f - titleHeight)) / numCharts + titleHeight;
 		}
 
-		private static ChartArea AddChartArea(Chart chart, string name, string axisXTitle, int xMax, int xMin,
+		private ChartArea AddChartArea(Chart chart, string name, string axisXTitle, int xMax, int xMin,
 			string axisYTitle, bool discreteValues)
 		{
 			var chartArea = new ChartArea { Name = name };
@@ -431,7 +431,7 @@ namespace TUGraz.VectoCore.Tests.Utils
 			return chartArea;
 		}
 
-		private static Legend CreateLegend(Chart chart, string dockToChartArea)
+		private Legend CreateLegend(Chart chart, string dockToChartArea)
 		{
 			var legend = new Legend(dockToChartArea) {
 				Docking = Docking.Right,
-- 
GitLab