From 81729b835c37461e48798f2a4e496490464de184 Mon Sep 17 00:00:00 2001 From: hiwis <hiwis@irmb.tu-bs.de> Date: Thu, 14 Mar 2019 16:16:44 +0100 Subject: [PATCH] fixed datatype of remainingDistance -> dashing cars after junctions are fixed, added method checkSpeed() to TrafficMovement --- src/Traffic/Junction/JunctionRandom.cpp | 48 +++++++++++++----------- src/Traffic/Junction/JunctionRandom.h | 12 ++---- src/Traffic/TrafficMovement.cpp | 18 ++++++--- src/Traffic/TrafficMovement.h | 3 +- src/Traffic/TrafficMovementFactory.cpp | 24 ++++++------ src/VirtualFluids_GPU/LBM/Simulation.cpp | 6 +-- src/VirtualFluids_GPU/LBM/Simulation.h | 2 +- targets/apps/LBM/Basel/main.cpp | 3 +- 8 files changed, 62 insertions(+), 54 deletions(-) diff --git a/src/Traffic/Junction/JunctionRandom.cpp b/src/Traffic/Junction/JunctionRandom.cpp index fd8112804..b3bfdd4e0 100644 --- a/src/Traffic/Junction/JunctionRandom.cpp +++ b/src/Traffic/Junction/JunctionRandom.cpp @@ -92,9 +92,8 @@ void JunctionRandom::updateJunction() void JunctionRandom::calculateTimeStep(TrafficMovement& road) { - index = 0; + uint index = 0; for (int carSpeed : data.carsOnJunction) { - if (carSpeed >= 0) { //check if there is a car on the junction if (carSpeed == 0) carSpeed += 1; @@ -103,27 +102,21 @@ void JunctionRandom::calculateTimeStep(TrafficMovement& road) } ++index; } - writeConcentrations(road); } void JunctionRandom::applyRules(int & carSpeed, const int & index, TrafficMovement& road) { - remainingDistance = static_cast<uint>(carSpeed) - data.alreadyMoved[index]; - + int remainingDistance = static_cast<uint>(carSpeed) - data.alreadyMoved[index]; if (remainingDistance > 0) { - outCell = chooseOutCell(index); + int outCell = chooseOutCell(index); if (outCell >= 0) { breakCar(outCell, carSpeed, remainingDistance, index, road); - if (remainingDistance > 0) { - moveCar(outCell, carSpeed, index, road); - } - else { - data.carsOnJunction[index] = 0; + moveCar(outCell, carSpeed, index, remainingDistance, road); + return; } - return; } } data.carsOnJunction[index] = 0; //cars, which can't cross the junctionin one timestep, because they already moved to many cells, loose their speed. @@ -131,9 +124,9 @@ void JunctionRandom::applyRules(int & carSpeed, const int & index, TrafficMoveme } -void JunctionRandom::breakCar(uint outCellIndex, int &speed, uint &remainingDistance, const int & index, TrafficMovement& road) +void JunctionRandom::breakCar(uint outCellIndex, int &speed, int &remainingDistance, const int & index, TrafficMovement& road) { - gap = road.getGapAfterOutCell(outCellIndex, remainingDistance); + int gap = road.getGapAfterOutCell(outCellIndex, remainingDistance); if (gap < remainingDistance) { speed = speed - remainingDistance + gap; remainingDistance = gap; @@ -141,7 +134,7 @@ void JunctionRandom::breakCar(uint outCellIndex, int &speed, uint &remainingDist } -void JunctionRandom::moveCar(uint outCell, int & carSpeed, const int & index, TrafficMovement& road) +void JunctionRandom::moveCar(uint outCell, int & carSpeed, const int & index, int remainingDistance, TrafficMovement& road) { road.moveJunctionCar(outCell, remainingDistance, carSpeed, data.oldSpeeds[index]); data.carsOnJunction[index] = -1; @@ -153,7 +146,7 @@ int JunctionRandom::chooseOutCell(const int & index) { std::vector<uint> outCellsTemp; - if (data.carCanNotEnterThisOutCell.size() > 0 && data.carCanNotEnterThisOutCell[index]) { + if (data.carCanNotEnterThisOutCell.size() > 0 && data.carCanNotEnterThisOutCell[index] >= 0) { for (uint cell : data.possibleOutCells) { if (cell != data.carCanNotEnterThisOutCell[index]) outCellsTemp.push_back(cell); @@ -162,10 +155,23 @@ int JunctionRandom::chooseOutCell(const int & index) else outCellsTemp = data.possibleOutCells; + int random = generateRandomOutCellIndex(castSizeT_Uint(outCellsTemp.size())); + if (random < 0) return -1; + + int outCell = outCellsTemp[random]; + data.possibleOutCells.erase(std::remove(data.possibleOutCells.begin(), data.possibleOutCells.end(), outCell), data.possibleOutCells.end()); + return outCell; +} - switch (outCellsTemp.size()) { + +int JunctionRandom::generateRandomOutCellIndex(uint outCellsTempSize) +{ + int random = 1000; + + switch (outCellsTempSize) { case 0: - return -1; + random = -1; + break; case 1: random = 0; break; @@ -180,11 +186,10 @@ int JunctionRandom::chooseOutCell(const int & index) break; default: std::cerr << "default in JunctionRandom::chooseOutCell()" << std::endl; + break; } - outCell = outCellsTemp[random]; - data.possibleOutCells.erase(std::remove(data.possibleOutCells.begin(), data.possibleOutCells.end(), outCell), data.possibleOutCells.end()); - return outCell; + return random; } void JunctionRandom::writeConcentrations(TrafficMovement& road) @@ -199,7 +204,6 @@ void JunctionRandom::writeConcentrations(TrafficMovement& road) } } - const std::vector<uint>& JunctionRandom::getInCellIndices() const { return data.inCellIndices; diff --git a/src/Traffic/Junction/JunctionRandom.h b/src/Traffic/Junction/JunctionRandom.h index 574e6098e..5f9142194 100644 --- a/src/Traffic/Junction/JunctionRandom.h +++ b/src/Traffic/Junction/JunctionRandom.h @@ -38,18 +38,12 @@ private: uint getInCellsVectorIndex(uint cellIndex); void applyRules(int &carSpeed,const int &index, TrafficMovement& road); - void breakCar(uint outCellIndex, int &speed, uint &remainingDistance, const int & index, TrafficMovement& road); - void moveCar(uint outCell, int & carSpeed, const int & index, TrafficMovement& road); + void breakCar(uint outCellIndex, int &speed, int &remainingDistance, const int & index, TrafficMovement& road); + void moveCar(uint outCell, int & carSpeed, const int & index, int remainingDistance, TrafficMovement& road); int chooseOutCell(const int & index); + int generateRandomOutCellIndex(uint outCellsTempSize); void writeConcentrations(TrafficMovement& road); -private: - //variables for temporaray calculations - uint remainingDistance; - int outCell; - uint random; - uint gap; - int index; }; diff --git a/src/Traffic/TrafficMovement.cpp b/src/Traffic/TrafficMovement.cpp index cd461e835..270b57191 100644 --- a/src/Traffic/TrafficMovement.cpp +++ b/src/Traffic/TrafficMovement.cpp @@ -142,7 +142,7 @@ void TrafficMovement::calculateTimestep(uint step) } } - calculateJunctionStep(); + calculateJunctionStep(); calculateSourceStep(); @@ -195,7 +195,7 @@ void TrafficMovement::applyRules(uint carIndex) void TrafficMovement::accelerateCar(uint & speed) { - if (speed < road->maxVelocity) { + if (speed <= road->maxVelocity - maxAcceleration) { speed += maxAcceleration; } } @@ -222,8 +222,8 @@ void TrafficMovement::dawdleCar(uint carIndex, uint & speed) } //Standard NaSch - if (randomNumber < dawdlePossibility) { - if (speed >= maxAcceleration) + if (randomNumber < dawdlePossibility) { + if (speed >= maxAcceleration) speed -= maxAcceleration; else speed = 0; @@ -447,16 +447,18 @@ void TrafficMovement::visualizeVehicleLengthForVTK() if (road->safetyDistance != 0) { for (uint i = 0; i < road->roadLength; i++) { if ((*pcurrent)[i] > -1) { + checkSpeed((*pcurrent)[i]); int neighbor = road->neighbors[i]; for (uint j = 1; j <= road->safetyDistance; j++) { + if (neighbor <= -1000) break; if ((*pcurrent)[neighbor] > -1) { std::cerr << "safetyDistance was violated: timestep: " << currentStep << "\t carIndex: " << i << std::endl; break; } - else + else (road->currentWithLongVehicles)[neighbor] = (*pcurrent)[i]; neighbor = road->neighbors[neighbor]; } @@ -466,3 +468,9 @@ void TrafficMovement::visualizeVehicleLengthForVTK() } +void TrafficMovement::checkSpeed(uint speed) +{ + if (speed > road->maxVelocity){ + std::cerr << "Speed is greater than allowed maxSpeed" << std::endl; + } +} \ No newline at end of file diff --git a/src/Traffic/TrafficMovement.h b/src/Traffic/TrafficMovement.h index 0d14e41c9..96821e99c 100644 --- a/src/Traffic/TrafficMovement.h +++ b/src/Traffic/TrafficMovement.h @@ -45,6 +45,8 @@ public: void visualizeVehicleLengthForVTK(); const std::vector<int> & getVehiclesForVTK(); + //for debugging + void checkSpeed(uint speed); private: //init @@ -80,7 +82,6 @@ private: //pollution void writeConcentration(uint index, uint oldSpeed); - private: std::unique_ptr<RoadNetworkData> road; std::unique_ptr<ConcentrationOutwriter> concWriter = nullptr; diff --git a/src/Traffic/TrafficMovementFactory.cpp b/src/Traffic/TrafficMovementFactory.cpp index dbdeb1637..044e7ec2b 100644 --- a/src/Traffic/TrafficMovementFactory.cpp +++ b/src/Traffic/TrafficMovementFactory.cpp @@ -34,22 +34,22 @@ void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart) //StreetPointFinder M:\Basel2019 C:\Users\schoen\Desktop\git\MS2 - finder.readStreets("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/streetTest/resources/ExampleStreets.txt"); - finder.writeVTK("M:/Basel2019/results/ExampleStreets.vtk"); - //finder.readStreets("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/streetTest/resources/ExampleStreets.txt"); - //finder.writeVTK("C:/Users/hiwi/BaselDokumente/Basel_Ergebnisse/ExampleStreets.vtk"); + //finder.readStreets("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/streetTest/resources/ExampleStreets.txt"); + //finder.writeVTK("M:/Basel2019/results/ExampleStreets.vtk"); + finder.readStreets("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/streetTest/resources/ExampleStreets.txt"); + finder.writeVTK("C:/Users/hiwi/BaselDokumente/Basel_Ergebnisse/ExampleStreets.vtk"); JunctionReader junctionReader; - junctionReader.readJunctions("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/Basel/resources/Junctions.txt", finder); - //junctionReader.readJunctions("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/Basel/resources/Junctions.txt", finder); + //junctionReader.readJunctions("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/Basel/resources/Junctions.txt", finder); + junctionReader.readJunctions("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/Basel/resources/Junctions.txt", finder); SinkReader sinkReader; - sinkReader.readSinks("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/Basel/resources/Sinks.txt", finder); - //sinkReader.readSinks("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/Basel/resources/Sinks.txt", finder); + //sinkReader.readSinks("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/Basel/resources/Sinks.txt", finder); + sinkReader.readSinks("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/Basel/resources/Sinks.txt", finder); SourceReader sourceReader; - sourceReader.readSources("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/Basel/resources/Sources.txt", finder); - //sourceReader.readSources("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/Basel/resources/Sources.txt", finder); + //sourceReader.readSources("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/Basel/resources/Sources.txt", finder); + sourceReader.readSources("C:/Users/hiwi/BaselDokumente/VirtualFluidsGPU/git/targets/apps/LBM/Basel/resources/Sources.txt", finder); //calculate RoadLength uint roadLength = 0; @@ -97,8 +97,8 @@ void TrafficMovementFactory::initTrafficMovement(real * pconcArrayStart) simulator->setConcentrationOutwriter(move(writer)); //prepare writing to vtk - this->outputPath = "M:/Basel2019/results/"; - //this->outputPath = "C:/Users/hiwi/BaselDokumente/Basel_Ergebnisse/"; + //this->outputPath = "M:/Basel2019/results/"; + this->outputPath = "C:/Users/hiwi/BaselDokumente/Basel_Ergebnisse/"; this->outputFilename = "ExampleStreets"; this->cars = &(simulator->getVehiclesForVTK()); diff --git a/src/VirtualFluids_GPU/LBM/Simulation.cpp b/src/VirtualFluids_GPU/LBM/Simulation.cpp index 35ffe8fed..9ded85b94 100644 --- a/src/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/VirtualFluids_GPU/LBM/Simulation.cpp @@ -177,8 +177,8 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std ////////////////////////////////////////////////////////////////////////// //Init Traffic by Anna ////////////////////////////////////////////////////////////////////////// - factory = new TrafficMovementFactory(); - factory->initTrafficMovement(para->getParH(0)->concentration); + trafficFactory = new TrafficMovementFactory(); + trafficFactory->initTrafficMovement(para->getParH(0)->concentration); ////////////////////////////////////////////////////////////////////////// @@ -1068,7 +1068,7 @@ void Simulation::run() //Calculate Traffic by Anna if (t % 100 == 0) { - factory->calculateTimestep(t / 100, t); + trafficFactory->calculateTimestep(t / 100, t); para->cudaCopyConcFile(0); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/VirtualFluids_GPU/LBM/Simulation.h b/src/VirtualFluids_GPU/LBM/Simulation.h index 73e350a5b..b36bdd30c 100644 --- a/src/VirtualFluids_GPU/LBM/Simulation.h +++ b/src/VirtualFluids_GPU/LBM/Simulation.h @@ -90,7 +90,7 @@ protected: //////////////////////////////////////////////////////////////////////////// EnstrophyAnalyzer *enstrophyWriter; //////////////////////////////////////////////////////////////////////////// - TrafficMovementFactory *factory; + TrafficMovementFactory *trafficFactory; }; #endif diff --git a/targets/apps/LBM/Basel/main.cpp b/targets/apps/LBM/Basel/main.cpp index db7877e21..35a778588 100644 --- a/targets/apps/LBM/Basel/main.cpp +++ b/targets/apps/LBM/Basel/main.cpp @@ -199,8 +199,9 @@ int main( int argc, char* argv[]) try { //multipleLevel("E:/temp/Basel2019/config/configBasel.txt"); //Tesla03 - multipleLevel("C:/Users/schoen/Desktop/bin/ReleaseBasel/configBasel.txt"); //Baumbart + //multipleLevel("C:/Users/schoen/Desktop/bin/ReleaseBasel/configBasel.txt"); //Baumbart //multipleLevel("F:/Work/Computations/gridGenerator/inp/configTest.txt"); + multipleLevel("C:/Users/hiwi/Desktop/configBasel.txt"); //Gamling } catch (const std::exception& e) { -- GitLab