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