From 7a3a247fcb8778c4e99b0c9119b61954f16e602a Mon Sep 17 00:00:00 2001
From: hiwis <hiwis@irmb.tu-bs.de>
Date: Tue, 12 Mar 2019 19:10:44 +0100
Subject: [PATCH] control Trafficsimulator from VirtualFluidsGPU, started
 sorting includes

---
 .../StreetPointFinder/StreetPointFinder.cpp   |  4 ----
 .../StreetPointFinder/StreetPointFinder.h     |  6 -----
 src/Traffic/Junction/JunctionRandom.cpp       | 12 ++++++----
 src/Traffic/Junction/JunctionRandom.h         |  4 ++--
 src/Traffic/Output/CarDisplay.cpp             | 11 ++++++++-
 src/Traffic/Output/CarDisplay.h               |  6 -----
 .../Output/ConcBySpeedAndAcceleration.cpp     | 24 +++++++++++++------
 .../Output/ConcBySpeedAndAcceleration.h       |  2 --
 .../Output/ConcentrationByPosition.cpp        | 17 +++++++++----
 src/Traffic/Output/ConcentrationByPosition.h  |  1 -
 src/Traffic/Output/ConcentrationOutwriter.cpp |  5 +++-
 src/Traffic/Output/ConcentrationOutwriter.h   |  3 ---
 src/Traffic/RoadNetwork/RoadMaker.cpp         |  9 ++++---
 src/Traffic/RoadNetwork/RoadMaker.h           |  4 +++-
 src/Traffic/RoadNetwork/RoadNetworkData.h     |  4 +---
 src/Traffic/Sink/Sink.h                       |  1 -
 src/Traffic/Sink/SinkData.h                   |  2 --
 src/Traffic/Sink/SinkRandom.cpp               |  2 +-
 src/Traffic/Sink/SinkRandom.h                 |  6 ++---
 src/Traffic/TrafficMovement.cpp               |  8 +++++++
 src/Traffic/TrafficMovement.h                 | 18 ++++++--------
 src/Traffic/TrafficMovementFactory.cpp        | 14 +++++------
 src/Traffic/TrafficMovementFactory.h          |  5 ++--
 src/Traffic/Utilities/VectorHelper.h          |  6 ++---
 src/Traffic/Utilities/safe_casting.h          | 21 ++++++++++++++++
 src/VirtualFluids_GPU/LBM/Simulation.cpp      | 14 ++++++++++-
 src/VirtualFluids_GPU/LBM/Simulation.h        |  2 ++
 targets/apps/LBM/TrafficTest/TrafficTest.cpp  | 12 +++++-----
 targets/libs/VirtualFluids_GPU/CMakeLists.txt |  8 ++++---
 29 files changed, 140 insertions(+), 91 deletions(-)
 create mode 100644 src/Traffic/Utilities/safe_casting.h

diff --git a/src/GridGenerator/StreetPointFinder/StreetPointFinder.cpp b/src/GridGenerator/StreetPointFinder/StreetPointFinder.cpp
index 9b6808e1c..05aef5d5e 100644
--- a/src/GridGenerator/StreetPointFinder/StreetPointFinder.cpp
+++ b/src/GridGenerator/StreetPointFinder/StreetPointFinder.cpp
@@ -471,7 +471,3 @@ void StreetPointFinder::writeMappingFile(std::string gridPath)
 	*logging::out << logging::Logger::INFO_INTERMEDIATE << "done!\n";
 }
 
-void StreetPointFinder::dummy()
-{
-	int a = 5;
-}
\ No newline at end of file
diff --git a/src/GridGenerator/StreetPointFinder/StreetPointFinder.h b/src/GridGenerator/StreetPointFinder/StreetPointFinder.h
index f5dec13e9..177a4cbd2 100644
--- a/src/GridGenerator/StreetPointFinder/StreetPointFinder.h
+++ b/src/GridGenerator/StreetPointFinder/StreetPointFinder.h
@@ -6,8 +6,6 @@
 #include "Core/PointerDefinitions.h"
 #include "Core/DataTypes.h"
 
-//#include "Core/Logger/Logger.h"
-
 #include <VirtualFluidsDefinitions.h>
 
 class Grid;
@@ -59,10 +57,6 @@ struct VF_PUBLIC StreetPointFinder
     void writeSimulationFileSorted( std::string gridPath, real concentration, uint numberOfLevels, uint level );
 
     void writeMappingFile( std::string gridPath );
-
-
-
-	void dummy();
 };
 
 
diff --git a/src/Traffic/Junction/JunctionRandom.cpp b/src/Traffic/Junction/JunctionRandom.cpp
index 8a1a941ed..fd8112804 100644
--- a/src/Traffic/Junction/JunctionRandom.cpp
+++ b/src/Traffic/Junction/JunctionRandom.cpp
@@ -1,11 +1,13 @@
 #include "JunctionRandom.h"
 
-//#include <iostream>
+#include <iostream>
 #include <algorithm>
 
 #include "TrafficMovement.h"
-//#include "Utilities/invalidInput_error.h"
-//#include "Utilities/VectorHelper.h"
+
+#include "Utilities/invalidInput_error.h"
+#include "Utilities/VectorHelper.h"
+#include "Utilities/safe_casting.h"
 
 
 JunctionRandom::JunctionRandom(const std::vector<uint> &inCellIndices, const std::vector<uint> &outCellIndices)
@@ -13,7 +15,7 @@ JunctionRandom::JunctionRandom(const std::vector<uint> &inCellIndices, const std
 	data.inCellIndices = inCellIndices;
 	data.outCellIndices = outCellIndices;
 
-	uint inRoads = inCellIndices.size();
+	uint inRoads = castSizeT_Uint(inCellIndices.size());
 
 	data.carCanEnter.resize(inRoads);
 	std::fill(data.carCanEnter.begin(), data.carCanEnter.end(), true);
@@ -69,7 +71,7 @@ uint JunctionRandom::getInCellsVectorIndex(uint cellIndex)
 
 		if (it != data.inCellIndices.end())
 		{
-			return distance(data.inCellIndices.begin(), it);
+			return static_cast <uint> (distance(data.inCellIndices.begin(), it));
 		}
 
 		throw std::runtime_error("The passed cell is not an incoming cell to this junction.");
diff --git a/src/Traffic/Junction/JunctionRandom.h b/src/Traffic/Junction/JunctionRandom.h
index 416d03e7f..574e6098e 100644
--- a/src/Traffic/Junction/JunctionRandom.h
+++ b/src/Traffic/Junction/JunctionRandom.h
@@ -1,8 +1,8 @@
 #pragma once
-#include <VirtualFluidsDefinitions.h>
-
 #include <random> 
 #include <vector>
+
+#include <VirtualFluidsDefinitions.h>
 #include "Core/DataTypes.h"
 
 #include "Junction.h"
diff --git a/src/Traffic/Output/CarDisplay.cpp b/src/Traffic/Output/CarDisplay.cpp
index 6a22d2ae0..6543a9ca1 100644
--- a/src/Traffic/Output/CarDisplay.cpp
+++ b/src/Traffic/Output/CarDisplay.cpp
@@ -1,10 +1,19 @@
 #include "CarDisplay.h"
 
+#include <fstream>
+#include <iostream>
+#include <iomanip>	//formatting output streams
+#include <windows.h> //for colourful console output
+#include <stdexcept>
+
+#include "Utilities/VectorHelper.h"
+#include "Utilities/safe_casting.h"
+
 CarDisplay::CarDisplay(std::vector<int> **pcurrent, const uint safetyDistance):
 	safetyDistance{ safetyDistance }
 {
 	this->ppcurrent = pcurrent;
-	roadLength = (*pcurrent)->size();
+	roadLength = castSizeT_Uint((*pcurrent)->size());
 }
 
 
diff --git a/src/Traffic/Output/CarDisplay.h b/src/Traffic/Output/CarDisplay.h
index 34e84fb7d..5c7f4a643 100644
--- a/src/Traffic/Output/CarDisplay.h
+++ b/src/Traffic/Output/CarDisplay.h
@@ -1,19 +1,13 @@
 #pragma once
 #include <VirtualFluidsDefinitions.h>
 
-#include <fstream>
-#include <iostream>
 #include <vector>
 #include <memory>
-#include <iomanip>	//formatting output streams
-#include <windows.h> //for colourful console output
-#include <stdexcept>
 
 #include "Sink/Sink.h"
 #include "Source/Source.h"
 #include "Junction/Junction.h"
 
-#include "Utilities/VectorHelper.h"
 
 class VF_PUBLIC CarDisplay {
 public:
diff --git a/src/Traffic/Output/ConcBySpeedAndAcceleration.cpp b/src/Traffic/Output/ConcBySpeedAndAcceleration.cpp
index 6305b2fe4..17d54719b 100644
--- a/src/Traffic/Output/ConcBySpeedAndAcceleration.cpp
+++ b/src/Traffic/Output/ConcBySpeedAndAcceleration.cpp
@@ -1,20 +1,30 @@
 #include "ConcBySpeedAndAcceleration.h"
 
+#include <iostream>
+
 ConcBySpeedAndAcceleration::ConcBySpeedAndAcceleration(uint roadlength, uint maxSpeed)
 {
+	std::cout << "using ConcBySpeedAndAcceleration::concentration for concentrations" << std::endl;
 	concentration.resize(roadlength);
-	this->maxAcceleration = static_cast<real>(maxAcceleration);
 	this->maxSpeed = static_cast<real>(maxSpeed);
 }
 
 
 ConcBySpeedAndAcceleration::ConcBySpeedAndAcceleration(uint roadlength, real * concArrayStart, uint maxSpeed)
 {
-	useLBMConcArray = true;
-	this->roadLength = roadlength;
-	this->concArrayStart = concArrayStart;
-	this->maxAcceleration = static_cast<real>(maxAcceleration);
-	this->maxSpeed = static_cast<real>(maxSpeed);
+	if (concArrayStart == nullptr) {
+		std::cout << "using ConcBySpeedAndAcceleration::concentration for concentrations" << std::endl;
+		concentration.resize(roadlength);
+		this->maxSpeed = static_cast<real>(maxSpeed);
+	}
+	else {
+		std::cout << "using passed array for concentrations" << std::endl;
+		useLBMConcArray = true;
+		this->roadLength = roadlength;
+		this->concArrayStart = concArrayStart;
+		this->maxSpeed = static_cast<real>(maxSpeed);
+	}
+
 }
 
 //
@@ -53,7 +63,7 @@ real ConcBySpeedAndAcceleration::chooseConc(uint oldSpeed, uint speed)
 		return 0.75f;
 	else if (speed < oldSpeed) //Brake
 		return 0.45f;
-	else 
+	else
 		std::cerr << "couldn't choose driving state in ConcentrationBySpeedAndAcceleration::chooseConc" << std::endl;
 	return -1.0f;
 }
diff --git a/src/Traffic/Output/ConcBySpeedAndAcceleration.h b/src/Traffic/Output/ConcBySpeedAndAcceleration.h
index 5fcc5568c..bfd26c958 100644
--- a/src/Traffic/Output/ConcBySpeedAndAcceleration.h
+++ b/src/Traffic/Output/ConcBySpeedAndAcceleration.h
@@ -1,5 +1,4 @@
 #pragma once
-#include <VirtualFluidsDefinitions.h>
 
 #include "ConcentrationOutwriter.h"
 
@@ -20,6 +19,5 @@ private:
 
 private:
 	real maxSpeed = 0;
-	real maxAcceleration;
 };
 
diff --git a/src/Traffic/Output/ConcentrationByPosition.cpp b/src/Traffic/Output/ConcentrationByPosition.cpp
index 39c6a07ad..4fe7926da 100644
--- a/src/Traffic/Output/ConcentrationByPosition.cpp
+++ b/src/Traffic/Output/ConcentrationByPosition.cpp
@@ -1,17 +1,26 @@
 #include "ConcentrationByPosition.h"
 
-
+#include <iostream>
 
 ConcentrationByPosition::ConcentrationByPosition(uint roadlength, uint maxSpeed)
 {
+	std::cout << "using ConcentrationByPosition::concentration for concentrations" << std::endl;
 	concentration.resize(roadlength);
 }
 
 ConcentrationByPosition::ConcentrationByPosition(uint roadlength, real * concArrayStart, uint maxSpeed)
 {
-	useLBMConcArray = true;
-	this->roadLength = roadLength;
-	this->concArrayStart = concArrayStart;
+	if (concArrayStart == nullptr) {
+		std::cout << "using ConcentrationByPosition::concentration for concentrations" << std::endl;
+		concentration.resize(roadlength);
+	}
+	else {
+		std::cout << "using passed array for concentrations" << std::endl;
+		useLBMConcArray = true;
+		this->roadLength = roadLength;
+		this->concArrayStart = concArrayStart;
+	}
+
 }
 
 //void ConcentrationByPosition::calculateConcFromCarDistribution(const std::vector<int>& currentCarDistribution)
diff --git a/src/Traffic/Output/ConcentrationByPosition.h b/src/Traffic/Output/ConcentrationByPosition.h
index 939ef58fa..d87ded6d8 100644
--- a/src/Traffic/Output/ConcentrationByPosition.h
+++ b/src/Traffic/Output/ConcentrationByPosition.h
@@ -1,5 +1,4 @@
 #pragma once
-#include <VirtualFluidsDefinitions.h>
 
 #include "ConcentrationOutwriter.h"
 
diff --git a/src/Traffic/Output/ConcentrationOutwriter.cpp b/src/Traffic/Output/ConcentrationOutwriter.cpp
index bd2f03914..6b6301d3b 100644
--- a/src/Traffic/Output/ConcentrationOutwriter.cpp
+++ b/src/Traffic/Output/ConcentrationOutwriter.cpp
@@ -1,5 +1,8 @@
 #include "ConcentrationOutwriter.h"
 
+#include <iostream>
+#include <iomanip>	//formatting output streams
+#include <windows.h> //for colourful console output
 
 void ConcentrationOutwriter::resetConcentrations()
 {
@@ -7,7 +10,7 @@ void ConcentrationOutwriter::resetConcentrations()
 		for (real* p = concArrayStart; p < concArrayStart + roadLength; ++p)
 			*p = 0.0;
 	else
-		std::fill(concentration.begin(), concentration.end(), 0.0);
+		std::fill(concentration.begin(), concentration.end(), 0.0f);
 }
 
 
diff --git a/src/Traffic/Output/ConcentrationOutwriter.h b/src/Traffic/Output/ConcentrationOutwriter.h
index 2df134907..8908b508c 100644
--- a/src/Traffic/Output/ConcentrationOutwriter.h
+++ b/src/Traffic/Output/ConcentrationOutwriter.h
@@ -1,9 +1,6 @@
 #pragma once
 
 #include <vector>
-#include <iostream>
-#include <iomanip>	//formatting output streams
-#include <windows.h> //for colourful console output
 
 #include <VirtualFluidsDefinitions.h>
 #include "Core/DataTypes.h"
diff --git a/src/Traffic/RoadNetwork/RoadMaker.cpp b/src/Traffic/RoadNetwork/RoadMaker.cpp
index bdd8822cd..b9b84f65e 100644
--- a/src/Traffic/RoadNetwork/RoadMaker.cpp
+++ b/src/Traffic/RoadNetwork/RoadMaker.cpp
@@ -1,5 +1,8 @@
 #include "RoadMaker.h"
 
+#include "Utilities/VectorHelper.h"
+#include "Utilities/invalidInput_error.h"
+#include "Utilities/safe_casting.h"
 
 //random vehicle Distribution
 RoadMaker::RoadMaker(const uint roadLength, const uint maxVelocity, uint vehicleLength, const real vehicleDensity)
@@ -24,7 +27,7 @@ RoadMaker::RoadMaker(const uint roadLength, const uint maxVelocity, uint vehicle
 //given vehicle distribution
 RoadMaker::RoadMaker(const std::vector<int> vehicleDistribution, const uint maxVelocity, uint vehicleLength)
 {
-	this->roadLength = vehicleDistribution.size();
+	this->roadLength = castSizeT_Uint(vehicleDistribution.size());
 
 	this->maxVelocity = maxVelocity;
 	initVehicleLength(vehicleLength);
@@ -168,7 +171,7 @@ void RoadMaker::setJunctionAsNeighbor(std::unique_ptr<Junction> & junction)
 {
 	//set the junction as neighbor of the incoming cells
 
-	int junctionIndex = -1000 - junctions.size(); //value range: -1000 to -1999
+	int junctionIndex = -1000 - castSizeT_Int(junctions.size()); //value range: -1000 to -1999
 	std::vector<uint> inCells = junction->getInCellIndices();
 
 	try {
@@ -221,7 +224,7 @@ void RoadMaker::setSinkAsNeighbor(std::unique_ptr<Sink> & sink)
 {
 	//set the sink as neighbor of the incoming cell
 
-	int sinkIndex = -2000 - sinks.size(); //value range: -2000 to -2999
+	int sinkIndex = -2000 - castSizeT_Int(sinks.size()); //value range: -2000 to -2999
 	uint sinkCell = sink->getIndex();
 
 	if (sinkCell >= roadLength) throw invalidInput_error("The index of a sink ist greater than the roadLength.");
diff --git a/src/Traffic/RoadNetwork/RoadMaker.h b/src/Traffic/RoadNetwork/RoadMaker.h
index 52569b745..5029d922b 100644
--- a/src/Traffic/RoadNetwork/RoadMaker.h
+++ b/src/Traffic/RoadNetwork/RoadMaker.h
@@ -1,8 +1,10 @@
  #pragma once
 #include <random>
+
 #include "RoadNetworkData.h"
+
 #include "Utilities/RandomHelper.h"
-#include <VirtualFluidsDefinitions.h>
+
 
 struct VF_PUBLIC RoadMaker :
 	public RoadNetworkData
diff --git a/src/Traffic/RoadNetwork/RoadNetworkData.h b/src/Traffic/RoadNetwork/RoadNetworkData.h
index c744b08bd..1a19822bf 100644
--- a/src/Traffic/RoadNetwork/RoadNetworkData.h
+++ b/src/Traffic/RoadNetwork/RoadNetworkData.h
@@ -2,11 +2,9 @@
 #include <memory>
 #include <vector>
 
-#include "Utilities/VectorHelper.h"
-#include "Utilities/invalidInput_error.h"
-
 #include <VirtualFluidsDefinitions.h>
 
+
 #include "Source/Source.h"
 #include "Sink/Sink.h"
 #include "Junction/Junction.h"
diff --git a/src/Traffic/Sink/Sink.h b/src/Traffic/Sink/Sink.h
index ce75f248a..4954b40eb 100644
--- a/src/Traffic/Sink/Sink.h
+++ b/src/Traffic/Sink/Sink.h
@@ -1,7 +1,6 @@
 #pragma once
 
 #include "SinkData.h"
-#include <VirtualFluidsDefinitions.h>
 
 class VF_PUBLIC Sink
 {
diff --git a/src/Traffic/Sink/SinkData.h b/src/Traffic/Sink/SinkData.h
index 08f4c633c..fe573691c 100644
--- a/src/Traffic/Sink/SinkData.h
+++ b/src/Traffic/Sink/SinkData.h
@@ -1,7 +1,5 @@
 #pragma once
 
-#include <memory>
-#include <vector>
 #include <VirtualFluidsDefinitions.h>
 #include "Core/DataTypes.h"
 
diff --git a/src/Traffic/Sink/SinkRandom.cpp b/src/Traffic/Sink/SinkRandom.cpp
index 2d7894104..63a792ac2 100644
--- a/src/Traffic/Sink/SinkRandom.cpp
+++ b/src/Traffic/Sink/SinkRandom.cpp
@@ -1,6 +1,6 @@
 #include "SinkRandom.h"
 
-
+#include "Utilities/invalidInput_error.h"
 
 SinkRandom::SinkRandom(uint sinkIndex, real sinkBlockedPossibility)
 {
diff --git a/src/Traffic/Sink/SinkRandom.h b/src/Traffic/Sink/SinkRandom.h
index bbb539952..ed7426103 100644
--- a/src/Traffic/Sink/SinkRandom.h
+++ b/src/Traffic/Sink/SinkRandom.h
@@ -1,13 +1,11 @@
 #pragma once
 
-#include <VirtualFluidsDefinitions.h>
-
 #include <iostream>
 #include <random>
 
-#include "Utilities/RandomHelper.h"
 #include "Sink.h"
-#include "Utilities/invalidInput_error.h"
+
+#include "Utilities/RandomHelper.h"
 
 class VF_PUBLIC SinkRandom:
 	public Sink
diff --git a/src/Traffic/TrafficMovement.cpp b/src/Traffic/TrafficMovement.cpp
index 7a5beff95..47f046157 100644
--- a/src/Traffic/TrafficMovement.cpp
+++ b/src/Traffic/TrafficMovement.cpp
@@ -1,5 +1,13 @@
 #include "TrafficMovement.h"
 
+#include <iostream>
+#include <stdexcept>
+
+#include "Utilities/invalidInput_error.h"
+#include "Utilities/VectorHelper.h"
+#include "Utilities/RandomHelper.h"
+#include "Output/ConcentrationOutwriter.h"
+#include "Output/CarDisplay.h"
 
 TrafficMovement::TrafficMovement(std::unique_ptr<RoadNetworkData> road, const real dawdlePossibility)
 {
diff --git a/src/Traffic/TrafficMovement.h b/src/Traffic/TrafficMovement.h
index 8551fa74c..f3f9a354d 100644
--- a/src/Traffic/TrafficMovement.h
+++ b/src/Traffic/TrafficMovement.h
@@ -1,22 +1,18 @@
 #pragma once
-#include <VirtualFluidsDefinitions.h>
-
-#include <iostream>
 
 #include <vector>
 #include <random> 
 #include <memory>
-#include <stdexcept>
 
-#include "Utilities/invalidInput_error.h"
-#include "Utilities/VectorHelper.h"
-#include "Utilities/RandomHelper.h"
+#include <VirtualFluidsDefinitions.h>
+#include "Core/DataTypes.h"
+
 #include "RoadNetwork/RoadNetworkData.h"
-#include "Output/ConcentrationOutwriter.h"
-#include "Output/CarDisplay.h"
 
+class ConcentrationOutwriter;
+class CarDisplay;
 
-class VF_PUBLIC TrafficMovement 
+class VF_PUBLIC TrafficMovement
 {
 public:
 	TrafficMovement(std::unique_ptr<RoadNetworkData> road, const real dawdlePossibility);
@@ -90,7 +86,7 @@ private:
 
 	std::vector<int> *pcurrent;
 	std::vector<int> *pnext;
-	std::vector<int> *pdummy; 
+	std::vector<int> *pdummy;
 
 	real dawdlePossibility;
 
diff --git a/src/Traffic/TrafficMovementFactory.cpp b/src/Traffic/TrafficMovementFactory.cpp
index 9c61a1496..5c0f71378 100644
--- a/src/Traffic/TrafficMovementFactory.cpp
+++ b/src/Traffic/TrafficMovementFactory.cpp
@@ -1,7 +1,7 @@
 #include "TrafficMovementFactory.h"
 
+#include <iostream>
 
-//#include "GridGenerator/StreetPointFinder/StreetPointFinder.h"
 #include "GridGenerator/StreetPointFinder/JunctionReader.h"
 #include "GridGenerator/StreetPointFinder/SourceReader.h"
 #include "GridGenerator/StreetPointFinder/SinkReader.h"
@@ -13,13 +13,14 @@
 #include "Sink/SinkRandom.h"
 #include "Output/ConcentrationByPosition.h"
 #include "Output/ConcBySpeedAndAcceleration.h"
+#include "Utilities/safe_casting.h"
 
 
 TrafficMovementFactory::TrafficMovementFactory()
 {
 }
 
-void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart, uint concArraySize)
+void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart)
 {
 	//Variables
 
@@ -47,7 +48,7 @@ void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart, uint co
 
 	//calculate RoadLength
 	uint roadLength = 0;
-	uint numberOfStreets = finder.streets.size();
+	uint numberOfStreets = castSizeT_Uint(finder.streets.size());
 	for (uint i = 0; i < numberOfStreets; i++) {
 		roadLength += finder.streets[i].numberOfCells;
 	}
@@ -86,8 +87,7 @@ void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart, uint co
 
 
 	//init ConcentrationOutwriter
-	std::unique_ptr<ConcentrationOutwriter> writer = std::make_unique<ConcBySpeedAndAcceleration>(ConcBySpeedAndAcceleration(simulator->getRoadLength(), simulator->getMaxVelocity()));
-	//std::unique_ptr<ConcentrationOutwriter> writer = std::make_unique<ConcentrationByPosition>(ConcentrationByPosition(simulator->getRoadLength()), pconcArrayStart, concArraySize);
+	std::unique_ptr<ConcentrationOutwriter> writer = std::make_unique<ConcBySpeedAndAcceleration>(ConcBySpeedAndAcceleration(simulator->getRoadLength(), pconcArrayStart));
 	simulator->setConcentrationOutwriter(move(writer));
 
 	//prepare writing to vtk
@@ -99,9 +99,9 @@ void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart, uint co
 
 }
 
-void TrafficMovementFactory::calculateTimestep(uint step)
+void TrafficMovementFactory::calculateTimestep(uint step, uint stepForVTK)
 {
 	simulator->calculateTimestep(step);
 	simulator->visualizeVehicleLengthForVTK();
-	finder.writeVTK(outputPath + outputFilename + "_" + std::to_string(step) + ".vtk", *cars);
+	finder.writeVTK(outputPath + outputFilename + "_" + std::to_string(stepForVTK) + ".vtk", *cars);
 }
\ No newline at end of file
diff --git a/src/Traffic/TrafficMovementFactory.h b/src/Traffic/TrafficMovementFactory.h
index 622276364..4db4d0104 100644
--- a/src/Traffic/TrafficMovementFactory.h
+++ b/src/Traffic/TrafficMovementFactory.h
@@ -1,7 +1,6 @@
 # pragma once
 //#include <VirtualFluidsDefinitions.h>
 
-#include <iostream>
 #include <vector>
 #include <memory>
 
@@ -15,8 +14,8 @@ class VF_PUBLIC TrafficMovementFactory {
 public:
 	TrafficMovementFactory();
 	~TrafficMovementFactory() {};
-	void initTrafficMovement(real * pconcArrayStart = nullptr, uint concArraySize = 0);
-	void calculateTimestep(uint step);
+	void initTrafficMovement(real * pconcArrayStart = nullptr);
+	void calculateTimestep(uint step, uint stepForVTK);
 
 
 private:
diff --git a/src/Traffic/Utilities/VectorHelper.h b/src/Traffic/Utilities/VectorHelper.h
index bda0acf9e..21161e670 100644
--- a/src/Traffic/Utilities/VectorHelper.h
+++ b/src/Traffic/Utilities/VectorHelper.h
@@ -1,13 +1,13 @@
 #pragma once
-#include <VirtualFluidsDefinitions.h>
-#include "Core/DataTypes.h"
-
 #include <vector>
 #include <iostream>
 
 #include <windows.h> //for colourful console output
 #include <iomanip>	//formatting output streams
 
+#include <VirtualFluidsDefinitions.h>
+#include "Core/DataTypes.h"
+
 class VF_PUBLIC VectorHelper
 {
 public:
diff --git a/src/Traffic/Utilities/safe_casting.h b/src/Traffic/Utilities/safe_casting.h
new file mode 100644
index 000000000..1e921f9df
--- /dev/null
+++ b/src/Traffic/Utilities/safe_casting.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <stdexcept>
+#include "Core/DataTypes.h"
+
+
+static uint castSizeT_Uint(size_t number) {
+	if (number > UINT_MAX)
+	{
+		throw std::overflow_error("number is larger than UINT_MAX");
+	}
+	return static_cast<uint>(number);
+}
+
+static int castSizeT_Int(size_t number) {
+	if (number > INT_MAX)
+	{
+		throw std::overflow_error("number is larger than INT_MAX");
+	}
+	return static_cast<uint>(number);
+}
\ No newline at end of file
diff --git a/src/VirtualFluids_GPU/LBM/Simulation.cpp b/src/VirtualFluids_GPU/LBM/Simulation.cpp
index b163b32f5..85de96476 100644
--- a/src/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -63,6 +63,8 @@
 #include "Output/DataWriter.h"
 #include "Kernel/KernelFactory/KernelFactory.h"
 #include "Kernel/Kernel.h"
+//////////////////////////////////////////////////////////////////////////
+#include "Traffic/TrafficMovementFactory.h"
 
 Simulation::Simulation()
 {
@@ -172,6 +174,11 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std
    ////////////////////////////////////////////////////////////////////////////
 
 
+   //////////////////////////////////////////////////////////////////////////
+   //Init Traffic by Anna
+   //////////////////////////////////////////////////////////////////////////
+   factory = new TrafficMovementFactory();
+   factory->initTrafficMovement(/*para->getParH(0)->c*/);
 
 
    //////////////////////////////////////////////////////////////////////////
@@ -1057,6 +1064,11 @@ void Simulation::run()
       //         //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
+			  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+				//Calculate Traffic by Anna
+				if (t % 100 == 0)
+					factory->calculateTimestep(t/100, t);
+			  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 			   ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 			   ////// comp
@@ -1086,7 +1098,7 @@ void Simulation::run()
                QADDirichletDev27( para->getParD(0)->numberofthreads,      para->getParD(0)->nx,					para->getParD(0)->ny,
 								  para->getParD(0)->d0SP.f[0],            para->getParD(0)->d27.f[0],			para->getParD(0)->TempVel.tempPulse,  
 								  para->getParD(0)->diffusivity,          para->getParD(0)->concIndex,			para->getParD(0)->QGeom.q27[0], 
-								  para->getParD(0)->numberOfPointsConc,   para->getParD(0)->numberOfPointsConc, para->getParD(0)->omega,
+								  para->getParD(0)->QGeom.kQ,             para->getParD(0)->numberOfPointsConc, para->getParD(0)->omega,
 								  para->getParD(0)->neighborX_SP,         para->getParD(0)->neighborY_SP,		para->getParD(0)->neighborZ_SP,
 								  para->getParD(0)->size_Mat_SP,          para->getParD(0)->evenOrOdd);
                getLastCudaError("QADDirichletDev27 execution failed");
diff --git a/src/VirtualFluids_GPU/LBM/Simulation.h b/src/VirtualFluids_GPU/LBM/Simulation.h
index e5345fe2a..73e350a5b 100644
--- a/src/VirtualFluids_GPU/LBM/Simulation.h
+++ b/src/VirtualFluids_GPU/LBM/Simulation.h
@@ -21,6 +21,7 @@ class RestartPostprocessor;
 class ForceCalculations;
 class DataWriter;
 class Kernel;
+class TrafficMovementFactory;
 
 
 class VF_PUBLIC Simulation
@@ -89,6 +90,7 @@ protected:
 	////////////////////////////////////////////////////////////////////////////
 	EnstrophyAnalyzer *enstrophyWriter;
 	////////////////////////////////////////////////////////////////////////////
+	TrafficMovementFactory *factory;
 
  };
 #endif
diff --git a/targets/apps/LBM/TrafficTest/TrafficTest.cpp b/targets/apps/LBM/TrafficTest/TrafficTest.cpp
index 3369ed6b6..cf974aa7a 100644
--- a/targets/apps/LBM/TrafficTest/TrafficTest.cpp
+++ b/targets/apps/LBM/TrafficTest/TrafficTest.cpp
@@ -12,21 +12,21 @@
 
 int main()
 {
-		uint numberOfTimesteps = 50;
+		uint numberOfTimesteps = 5;
 
 
 		//Logger
+		logging::Logger::addStream(&std::cout);
+		logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW);
+		logging::Logger::timeStamp(logging::Logger::ENABLE);
+		logging::Logger::enablePrintedRankNumbers(logging::Logger::ENABLE);
 
-		//logging::Logger::addStream(&std::cout);
-		//logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW);
-		//logging::Logger::timeStamp(logging::Logger::ENABLE);
-		//logging::Logger::enablePrintedRankNumbers(logging::Logger::ENABLE);
 
 		TrafficMovementFactory factory = TrafficMovementFactory();
 		factory.initTrafficMovement();
 
 		for (uint step = 1; step <= numberOfTimesteps; step++) {
-			factory.calculateTimestep(step);
+			factory.calculateTimestep(step,step);
 		}
 
 		std::cout << std::endl << std::endl;
diff --git a/targets/libs/VirtualFluids_GPU/CMakeLists.txt b/targets/libs/VirtualFluids_GPU/CMakeLists.txt
index 0a5661ab4..c350a2be2 100644
--- a/targets/libs/VirtualFluids_GPU/CMakeLists.txt
+++ b/targets/libs/VirtualFluids_GPU/CMakeLists.txt
@@ -3,16 +3,18 @@ setTargetNameToFolderName(${CMAKE_CURRENT_LIST_DIR})
 set(linkDirectories "")
 
 IF(MSVC)
-  set(libsToLink ws2_32 GridGenerator VirtualFluidsBasics Core) # ws_32 throws an error on Phoenix
+  set(libsToLink ws2_32 GridGenerator VirtualFluidsBasics Core Traffic) # ws_32 throws an error on Phoenix
 ELSE(MSVC)
-  set(libsToLink GridGenerator VirtualFluidsBasics Core)
+  set(libsToLink GridGenerator VirtualFluidsBasics Core Traffic)
 ENDIF(MSVC)
 
 set(includeDirectories ${CMAKE_SOURCE_DIR}/src/${targetName}
                        ${CMAKE_SOURCE_DIR}/src
                        ${CMAKE_SOURCE_DIR}/src/GridGenerator
                        ${CMAKE_SOURCE_DIR}/src/VirtualFluidsBasics
-                       ${CMAKE_SOURCE_DIR}/src/Core )
+                       ${CMAKE_SOURCE_DIR}/src/Core 
+					   ${CMAKE_SOURCE_DIR}/src/Traffic 
+					   )
 
 #glob files and save in MY_SRCS
 include(CMakePackage.cmake)
-- 
GitLab