diff --git a/CMake/cmake_config_files/MOLLOK.config.cmake b/CMake/cmake_config_files/MOLLOK.config.cmake index 2407cda6287cd0e171453d1559ab6585b0a09a33..03f83455175719ff5b0e786994213bbaa0fbd29e 100644 --- a/CMake/cmake_config_files/MOLLOK.config.cmake +++ b/CMake/cmake_config_files/MOLLOK.config.cmake @@ -5,7 +5,7 @@ ################################################################################# #SET TO CORRECT PATH: -SET(CMAKE_CUDA_ARCHITECTURES 52) +SET(CMAKE_CUDA_ARCHITECTURES 86) SET(PATH_NUMERICAL_TESTS "D:/out/numericalTests/") LIST(APPEND VF_COMPILER_DEFINITION "PATH_NUMERICAL_TESTS=${PATH_NUMERICAL_TESTS}") diff --git a/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp b/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp index 2263bf9ffec4c4e215d9abd622104040f31fa707..86d2227d200622ab3a2d87505ba5c7afcede36fe 100644 --- a/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp +++ b/apps/gpu/LBM/WTG_RUB/WTG_RUB.cpp @@ -94,6 +94,8 @@ const uint timeStepEnd = 100000; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void convertMPFile(SPtr <MultipleGridBuilder> gridBuilder, real& phi, std::vector<real>& origin, bool& measureVeloProfilesOnly, uint& maxLevel); + void addFineGrids(SPtr<MultipleGridBuilder> gridBuilder, uint &maxLevel, real &rotationOfCity); void readVelocityProfile(); @@ -143,7 +145,7 @@ void multipleLevel(const std::string& configPath) //TriangularMesh *RubSTL = TriangularMesh::make(inputPath + "stl/Var02_0deg_FD_b.stl"); TriangularMesh *RubSTL = TriangularMesh::make(inputPath + "stl/" + chooseVariation() + ".stl"); - // vector<real> originOfCityXY = { 600.0, y_max / 2, z_offset }; + std::vector<real> originOfCityXY = { 600.0, y_max / 2, z_offset }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // OPTIONS @@ -210,7 +212,7 @@ void multipleLevel(const std::string& configPath) para->setDevices(std::vector<uint>{(uint)0}); para->setOutputPath( path ); - para->setOutputPrefix( simulationName ); + para->setOutputPrefix( "Unified_" + simulationName ); para->setFName(para->getOutputPath() + "/" + para->getOutputPrefix()); @@ -223,7 +225,7 @@ void multipleLevel(const std::string& configPath) para->setVelocityRatio(velocity/ velocityLB); - para->setMainKernel("CumulantK17CompChim"); + para->setMainKernel("CumulantK17CompChim"); // CumulantK17Unified, CumulantK17CompChim para->setInitialCondition([&](real coordX, real coordY, real coordZ, real &rho, real &vx, real &vy, real &vz) { rho = (real)0.0; @@ -305,6 +307,18 @@ void multipleLevel(const std::string& configPath) }); } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Intializing MeasurePoints + para->setUseMeasurePoints(useMP); + if (para->getUseMeasurePoints()) { + convertMPFile(gridBuilder, rotationOfCity, originOfCityXY, measureVeloProfilesOnly, maxLevel); + // Number log-Files for each MeasurePoint: numberOfMPFiles = timeStepEnd/ClockCycle + para->setclockCycleForMP(timeStepEnd); + // Number of logged Timesteps for each file + para->settimestepForMP(timeStepOut / 100); + // para->settimestepForMP(timeStepOut); + para->setmeasurePoints(inputPath + "measurePoints.dat"); + } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -522,6 +536,131 @@ void addFineGrids(SPtr<MultipleGridBuilder> gridBuilder, uint &maxLevel, real &r } +void convertMPFile(SPtr<MultipleGridBuilder> gridBuilder, real &phi, std::vector<real> &originXY, bool &measureVeloProfilesOnly, uint &maxLevel) +{ + // File Reader&Writer for converting MP-Coordinates to Index: MeasurePoint placement requires "measurePoints.dat" + // with name, node-ID and level. This function can read a txt-File containing the name, X-Y-Z-Coordinates and level + // of measurePoints. After reading the txt-File and converting X-Y-Z to the node-ID, it writes "measurePoints.dat". + // Justification for this function: Human Readability and no changes in measurepoint core functions + + // File Opening Procedure + std::ifstream inFile; + if (measureVeloProfilesOnly) + inFile.open(inputPath + "measurePoints_veloProfiles.txt"); + else + inFile.open(inputPath + "measurePoints.txt"); + + // Check for error + if (inFile.fail()) { + std::cerr << "Error opening File" << std::endl; + exit(1); + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Reading Procedure + std::cout << "phi in degrees:" << phi << std::endl; + phi = phi * M_PI / 180; + std::cout << "phi in radians:" << phi << std::endl; + + std::vector<std::string> MP_name; + std::vector<real> MP_X, MP_Y, MP_Z; + std::vector<int> MP_level, MP_k; + + std::string name; + real X, Y, Z; + uint level, numberOfMeasurePoints; + + inFile >> numberOfMeasurePoints; + std::cout << "numberOfMeasurePoints: " << numberOfMeasurePoints << " "; + std::cout << "Coordinates from File\n"; + for (uint k = 0; k < numberOfMeasurePoints; k++) { + inFile >> name; + MP_name.push_back(name); + std::cout << "Name: " << MP_name[k] << " "; + + inFile >> X; + MP_X.push_back(X); + std::cout << "\t\tX: " << MP_X[k] << " "; + + inFile >> Y; + MP_Y.push_back(Y); + std::cout << "\t\tY: " << MP_Y[k] << " "; + + inFile >> Z; + if (((variant > 3 && variant < 7) || (variant > 9 && variant <= 12)) && k == 14) + Z += 2.25; // account for angled roof + MP_Z.push_back(Z); + std::cout << "\t\tZ: " << MP_Z[k] + z_offset << " "; + + inFile >> level; + if (level > maxLevel) + level = maxLevel; + MP_level.push_back(level); + std::cout << "\t\tLevel: " << MP_level[k] << std::endl; + } + inFile.close(); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + real X_temp, Y_temp; + // Transformation for phi radians around centre of city for MP[1..15] + if (!phi == 0) { + std::cout << "Calculating new Coordinates for MP01 to MP15 after Rotation of " << phi * 180 / M_PI + << "degrees (+: counter-clockwise / -: clockwise)\n"; + for (uint k = 0; k < 15; k++) { + X_temp = originXY[0] + (MP_X[k] - originXY[0]) * cos(phi) - (MP_Y[k] - originXY[1]) * sin(phi); + Y_temp = originXY[1] + (MP_X[k] - originXY[0]) * sin(phi) + (MP_Y[k] - originXY[1]) * cos(phi); + std::cout << "Name: " << MP_name[k] << " "; + std::cout << "\t\tX: " << X_temp << " "; + std::cout << "\t\tY: " << Y_temp << " "; + std::cout << "\t\tZ: " << MP_Z[k] << " " << std::endl; + + MP_X[k] = X_temp; + MP_Y[k] = Y_temp; + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Coordinates to Index Procedure + // std::cout << "Converting Coordinates to Index..." << std::endl; + for (uint k = 0; k < numberOfMeasurePoints; k++) { + MP_k.push_back( + gridBuilder->getGrid(MP_level[k]) + ->getSparseIndex(gridBuilder->getGrid(MP_level[k])->transCoordToIndex(MP_X[k], MP_Y[k], MP_Z[k]))); + if (MP_k[k] == -1) { + std::cerr << "Error: Could not convert Coordinate to Sparse Index for MP " << k + 1 << std::endl; + } + std::cout << MP_name[k] << "\tID = " + << gridBuilder->getGrid(MP_level[k]) + ->getSparseIndex( + gridBuilder->getGrid(MP_level[k])->transCoordToIndex(MP_X[k], MP_Y[k], MP_Z[k])) + << std::endl; + // std::cout << "ID = " << + // gridBuilder->getGrid(0)->getSparseIndex(gridBuilder->getGrid(0)->transCoordToIndex(-0.500000, + // -0.500000, 9.500000)) << std::endl; + } + // std::cout << "Done Converting Coordinates to Index..." << std::endl; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Writing Procedure + // std::cout << "Writing new file..." << std::endl; + std::ofstream outFile(inputPath + "measurePoints.dat"); + + outFile << numberOfMeasurePoints << std::endl; + for (uint j = 0; j < numberOfMeasurePoints; j++) { + outFile << MP_name[j] << " " << MP_k[j] << " " << MP_level[j] << std::endl; + // std::cout << MP_name[j] << "\t" << MP_k[j] << "\t" << MP_level[j] << std::endl; + } + // std::cout << "Done writing new file..." << std::endl; + outFile.close(); + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +} + std::string chooseVariation() { switch (variant) { diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp index 0bdb5cccaa460c51231f64285b75b17814c4d93e..b136ef7c6e2381dc42c1ed0b4bea79d138a11a3a 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp @@ -81,6 +81,8 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, std this->para = para; devCheck(comm->mapCudaDevice(para->getMyID(), para->getNumprocs(), para->getDevices(), para->getMaxDev())); + + para->initLBMSimulationParameter(); gridProvider->allocAndCopyForcing(); gridProvider->allocAndCopyQuadricLimiters(); diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp index de19d741935670cba0589786ab75bea63d3ae88e..1ce504c091f4ed75a6ed86dc8af34790765965c7 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp @@ -50,7 +50,7 @@ Parameter::Parameter(const vf::basics::ConfigurationFile &configData, int number ic.myid = myId; readConfigData(configData); - initLBMSimulationParameter(); + //initLBMSimulationParameter(); } void Parameter::readConfigData(const vf::basics::ConfigurationFile &configData) @@ -373,12 +373,7 @@ void Parameter::readConfigData(const vf::basics::ConfigurationFile &configData) this->setDoRestart(configData.getValue<bool>("DoRestart")); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if (configData.contains("NOGL")) - { - maxlevel = configData.getValue<int>("NOGL") - 1; - fine = maxlevel; - } - parH.resize(maxlevel + 1); - parD.resize(maxlevel + 1); + setMaxLevel(configData.getValue<int>("NOGL")); this->setGridX(std::vector<int>(this->getMaxLevel() + 1, 32)); this->setGridY(std::vector<int>(this->getMaxLevel() + 1, 32)); @@ -622,6 +617,9 @@ void Parameter::setD3Qxx(int d3qxx) void Parameter::setMaxLevel(int maxlevel) { this->maxlevel = maxlevel-1; + this->fine = this->maxlevel; + parH.resize(this->maxlevel + 1); + parD.resize(this->maxlevel + 1); } void Parameter::setParticleBasicLevel(int pbl) { diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h index d0d49fd23728ca0ca8f2774351d3fdb927f18838..6665190a4023654f9ee4d0dc0d3f5fc675a7e6da 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h @@ -315,6 +315,7 @@ class VIRTUALFLUIDS_GPU_EXPORT Parameter { public: Parameter(const vf::basics::ConfigurationFile &configData, int numberOfProcesses, int myId); + void initLBMSimulationParameter(); std::shared_ptr<LBMSimulationParameter> getParH(int level); std::shared_ptr<LBMSimulationParameter> getParD(int level); @@ -751,11 +752,10 @@ public: void setInitialCondition(std::function<void(real, real, real, real &, real &, real &, real &)> initialCondition); std::function<void(real, real, real, real &, real &, real &, real &)> &getInitialCondition(); - std::vector<std::shared_ptr<LBMSimulationParameter>> parH; - std::vector<std::shared_ptr<LBMSimulationParameter>> parD; + std::vector<std::shared_ptr<LBMSimulationParameter>> parH = std::vector<std::shared_ptr<LBMSimulationParameter>>(1); + std::vector<std::shared_ptr<LBMSimulationParameter>> parD = std::vector<std::shared_ptr<LBMSimulationParameter>>(1); private: void readConfigData(const vf::basics::ConfigurationFile &configData); - void initLBMSimulationParameter(); bool compOn { false }; bool diffOn { false };