From 811e344b35dc40f3ffd220718722f83e6b84c1d0 Mon Sep 17 00:00:00 2001 From: "TESLA03\\Master" <a.wellmann@tu-bs.de> Date: Tue, 29 Jun 2021 12:06:09 +0200 Subject: [PATCH] Fix BoundaryQs for velocity before only one channel side could have a velocity boundary condition (bc). When setting a bc at a second side, the first bc was overwritten. Velocity bcs were fied in the previous commit (bda2c544271657adfabb63e9ae974e77692566a6). This commit fixes the boundaryQs for velocity. --- .../GridReaderFiles/BoundaryQs.cpp | 15 +++++- .../GridReaderFiles/BoundaryQs.h | 4 +- .../GridReaderFiles/GridReader.cpp | 46 ++++++++++++++++--- .../GridReaderFiles/GridReader.h | 13 ++++-- 4 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.cpp index a05390733..ab266e499 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.cpp @@ -166,13 +166,26 @@ unsigned int BoundaryQs::getLevel() } -void BoundaryQs::setValues(real** q27, unsigned int level) const +void BoundaryQs::setValuesInVector(std::vector<std::vector<std::vector<real>>> &q27, unsigned int level) const +{ + for (std::size_t column = 0; column < values[level].size(); column++) + for (std::size_t index = 0; index < values[level][column].size(); index++) + q27[level][column].push_back(values[level][column][index]); +} + +void BoundaryQs::setValues(real **q27, unsigned int level) const { for (std::size_t column = 0; column < values[level].size(); column++) for (std::size_t index = 0; index < values[level][column].size(); index++) q27[column][index] = values[level][column][index]; } +void BoundaryQs::setIndexInVector(std::vector<std::vector<int>> &data, unsigned int level) const +{ + for (std::size_t index = 0; index < indices[level].size(); index++) + data[level].push_back(indices[level][index]); +} + void BoundaryQs::setIndex(int *data, unsigned int level) const { for (std::size_t index = 0; index < indices[level].size(); index++) diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.h index daefd2cac..804051824 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.h +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/BoundaryQs.h @@ -32,7 +32,9 @@ private: void init_Binary(); public: - void setIndex(int *indices, unsigned int level) const; + void setIndexInVector(std::vector<std::vector<int>> &data, unsigned int level) const; + void setValuesInVector(std::vector<std::vector<std::vector<real>>> &q27, unsigned int level) const; + void setIndex(int *indices, unsigned int level) const; void setValues(real** q27, unsigned int level) const; void getQs(std::vector<std::vector<std::vector<real> > > &qs); void getIndices(std::vector<std::vector<uint> > &indices); diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp index 09c71cef3..15250b31e 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.cpp @@ -119,6 +119,11 @@ void GridReader::allocArrays_BoundaryValues() velocityX_BCvalues.push_back(std::vector<real>()); velocityY_BCvalues.push_back(std::vector<real>()); velocityZ_BCvalues.push_back(std::vector<real>()); + velocityQs.push_back(std::vector<std::vector<real>>()); + velocityIndex.push_back(std::vector<int>()); + for (size_t j = 0; j < para->getD3Qxx(); j++) { + velocityQs[i].push_back(std::vector<real>()); + } } for (uint i = 0; i < channelBoundaryConditions.size(); i++) @@ -547,14 +552,15 @@ void GridReader::allocArrays_BoundaryQs() for (std::size_t i = 0; i < channelBoundaryConditions.size(); i++) { - if (this->channelBoundaryConditions[i] == "noSlip") { setNoSlipQs(BC_Qs[i]); } + if ( this->channelBoundaryConditions[i] == "noSlip" ) { setNoSlipQs(BC_Qs[i]); } else if (this->channelBoundaryConditions[i] == "velocity") { setVelocityQs(BC_Qs[i]); } - else if (this->channelBoundaryConditions[i] == "pressure") { setPressQs(BC_Qs[i]); } - else if (this->channelBoundaryConditions[i] == "outflow") { setOutflowQs(BC_Qs[i]); } + else if (this->channelBoundaryConditions[i] == "pressure") { setPressQs(BC_Qs[i]); } + else if (this->channelBoundaryConditions[i] == "outflow" ) { setOutflowQs(BC_Qs[i]); } } for (size_t lev = 0; lev < velocityIndex.size(); lev++) { if (velocityIndex[lev].size() > 1) { + copyVectorsToQStruct(velocityQs[lev], velocityIndex[lev], para->getParH(lev)->Qinflow); cudaMemoryManager->cudaCopyVeloBC(lev); } } @@ -583,15 +589,14 @@ void GridReader::setPressQs(std::shared_ptr<BoundaryQs> boundaryQ) const } } -void GridReader::setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ) const +void GridReader::setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ) { for (unsigned int level = 0; level <= boundaryQ->getLevel(); level++) { if (hasQs(boundaryQ, level)) { this->printQSize("velocity", boundaryQ, level); - this->initalQStruct(para->getParH(level)->Qinflow, boundaryQ, level); - cudaMemoryManager->cudaCopyVeloBC(level); + this->initalVectorForQStruct(velocityQs, velocityIndex, boundaryQ, level); } } } @@ -652,7 +657,34 @@ void GridReader::modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned /*------------------------------------------------------------------------------------------------*/ /*---------------------------------------private q methods----------------------------------------*/ /*------------------------------------------------------------------------------------------------*/ -void GridReader::initalQStruct(QforBoundaryConditions& Q, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const +void GridReader::initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, + std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const +{ + boundaryQ->setValuesInVector(Qs, level); + boundaryQ->setIndexInVector(index, level); +} + +void GridReader::copyVectorsToQStruct(std::vector<std::vector<real>> &Qs, + std::vector<int> &index, QforBoundaryConditions &Q) const +{ + QforBoundaryConditions qTemp; + this->setQ27Size(qTemp, Q.q27[0], Q.kQ); + + uint sizeOfValues = index.size(); + + for (size_t direction = 0; direction < para->getD3Qxx(); direction++) { + for (size_t indexQ = 0; indexQ < sizeOfValues; indexQ++) { + qTemp.q27[direction][indexQ] = Qs[direction][indexQ]; + } + } + + for (size_t indexQ = 0; indexQ < sizeOfValues; indexQ++) { + Q.k[indexQ] = index[indexQ]; + } +} + +void GridReader::initalQStruct(QforBoundaryConditions &Q, std::shared_ptr<BoundaryQs> boundaryQ, + unsigned int level) const { QforBoundaryConditions qTemp; this->setQ27Size(qTemp, Q.q27[0], Q.kQ); diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h index 933795940..f7a4c4306 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h @@ -25,7 +25,9 @@ private: std::vector<std::string> channelBoundaryConditions; std::shared_ptr<CoordNeighborGeoV> neighX, neighY, neighZ, neighWSB; std::vector<std::shared_ptr<BoundaryValues> > BC_Values; + std::vector<std::vector<real>> velocityX_BCvalues, velocityY_BCvalues, velocityZ_BCvalues; + std::vector<std::vector<std::vector<real>>> velocityQs; std::vector<std::vector<int>> velocityIndex; std::vector<std::vector<real>> pressureBCvalues; @@ -63,14 +65,19 @@ private: void setOutflow(int level, int sizePerLevel, int channelSide) const; - void setPressQs(std::shared_ptr<BoundaryQs> boundaryQ) const; - void setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ) const; + //void fillVelocityQVectors(int channelSide); + void setPressQs(std::shared_ptr<BoundaryQs> boundaryQ) const; + void setVelocityQs(std::shared_ptr<BoundaryQs> boundaryQ); void setOutflowQs(std::shared_ptr<BoundaryQs> boundaryQ) const; void setNoSlipQs(std::shared_ptr<BoundaryQs> boundaryQ) const; void setGeoQs(std::shared_ptr<BoundaryQs> boundaryQ) const; void modifyQElement(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; - void initalQStruct(QforBoundaryConditions& Q, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void initalVectorForQStruct(std::vector<std::vector<std::vector<real>>> &Qs, std::vector<std::vector<int>> &index, + std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; + void copyVectorsToQStruct(std::vector<std::vector<real>> &Qs, std::vector<int> &index, + QforBoundaryConditions &Q) const; + void initalQStruct(QforBoundaryConditions &Q, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; void printQSize(std::string bc, std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; void setSizeNoSlip(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; void setSizeGeoQs(std::shared_ptr<BoundaryQs> boundaryQ, unsigned int level) const; -- GitLab