From 0adbaf4fe465f9e6dd812ee05d2c8eebd08e0389 Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-braunschweig.de>
Date: Wed, 4 Aug 2021 16:18:33 +0200
Subject: [PATCH] Not add BC-nodes to fluid nodes any more

Thh new behaviour can turned off by passing false for the "onlyBulk" bool
---
 apps/gpu/LBM/MusselOyster/MusselOyster.cpp           |  4 ++--
 src/gpu/GridGenerator/grid/Field.cu                  |  6 ++++++
 src/gpu/GridGenerator/grid/Field.h                   |  1 +
 src/gpu/GridGenerator/grid/Grid.h                    |  5 +++--
 .../grid/GridBuilder/MultipleGridBuilder.cpp         |  4 ++--
 .../grid/GridBuilder/MultipleGridBuilder.h           |  2 +-
 src/gpu/GridGenerator/grid/GridImp.cu                | 12 +++++-------
 src/gpu/GridGenerator/grid/GridImp.h                 |  3 +--
 8 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
index 702b8851f..2b9ce1f11 100644
--- a/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
+++ b/apps/gpu/LBM/MusselOyster/MusselOyster.cpp
@@ -222,7 +222,7 @@ void multipleLevel(const std::string& configPath)
 
             gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
 
-            gridBuilder->findGeoFluidNodes();
+            gridBuilder->findFluidNodes(useStreams);
 
             if (generatePart == 0) {
                 gridBuilder->findCommunicationIndices(CommunicationDirections::PY, LBM);
@@ -262,7 +262,7 @@ void multipleLevel(const std::string& configPath)
             gridBuilder->setPeriodicBoundaryCondition(false, false, true);
 
             gridBuilder->buildGrids(LBM, true); // buildGrids() has to be called before setting the BCs!!!!
-            gridBuilder->findGeoFluidNodes();
+            gridBuilder->findFluidNodes(useStreams);
 
             //////////////////////////////////////////////////////////////////////////
             gridBuilder->setVelocityBoundaryCondition(SideType::PY, vxLB, 0.0, 0.0);
diff --git a/src/gpu/GridGenerator/grid/Field.cu b/src/gpu/GridGenerator/grid/Field.cu
index 6272a3a6e..eff280f5a 100644
--- a/src/gpu/GridGenerator/grid/Field.cu
+++ b/src/gpu/GridGenerator/grid/Field.cu
@@ -67,6 +67,12 @@ HOSTDEVICE bool Field::isFluid(uint index) const
     return type == FLUID || type == FLUID_CFC || type == FLUID_CFF || type == FLUID_FCC || type == FLUID_FCF || isBoundaryConditionNode(index);
 }
 
+HOSTDEVICE bool Field::isFluidBulk(uint index) const
+{
+    const char type = field[index];
+    return type == FLUID || type == FLUID_CFC || type == FLUID_CFF || type == FLUID_FCC || type == FLUID_FCF;
+}
+
 HOSTDEVICE bool Field::isInvalidSolid(uint index) const
 {
     return field[index] == INVALID_SOLID;
diff --git a/src/gpu/GridGenerator/grid/Field.h b/src/gpu/GridGenerator/grid/Field.h
index f79797afa..92b420d67 100644
--- a/src/gpu/GridGenerator/grid/Field.h
+++ b/src/gpu/GridGenerator/grid/Field.h
@@ -22,6 +22,7 @@ public:
     HOSTDEVICE bool isCoarseToFineNode(uint index) const;
     HOSTDEVICE bool isFineToCoarseNode(uint index) const;
 	HOSTDEVICE bool isFluid(uint index) const;
+    HOSTDEVICE bool isFluidBulk(uint index) const;
 	HOSTDEVICE bool isInvalidSolid(uint index) const;
 	HOSTDEVICE bool isQ(uint index) const;
     HOSTDEVICE bool isBoundaryConditionNode(uint index) const;
diff --git a/src/gpu/GridGenerator/grid/Grid.h b/src/gpu/GridGenerator/grid/Grid.h
index 3a70c16ad..855196dba 100644
--- a/src/gpu/GridGenerator/grid/Grid.h
+++ b/src/gpu/GridGenerator/grid/Grid.h
@@ -142,9 +142,10 @@ public:
     virtual void repairCommunicationInices(int direction) = 0;
 
     // needed for CUDA Streams MultiGPU
-    virtual void findFluidNodeIndices() = 0;
-    virtual uint getNumberOfFluidNodes() const = 0;
+    virtual void findFluidNodeIndices(bool onlyBulk) = 0;
+    virtual uint getNumberOfFluidNodes() const = 0;;
     virtual void getFluidNodeIndices(uint *fluidNodeIndices) const = 0;
+
 };
 
 #endif
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index f6e2de17d..21570f15d 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -600,11 +600,11 @@ void MultipleGridBuilder::findCommunicationIndices(int direction, LbmOrGks lbmOr
     *logging::out << logging::Logger::INFO_HIGH << "Done with findCommunicationIndices()\n";
 }
 
-void MultipleGridBuilder::findGeoFluidNodes()
+void MultipleGridBuilder::findFluidNodes(bool onlyBulk)
 {
     *logging::out << logging::Logger::INFO_HIGH << "Start findFluidNodes()\n";
     for (uint i = 0; i < grids.size(); i++)
-        grids[i]->findFluidNodeIndices();
+        grids[i]->findFluidNodeIndices(onlyBulk);
     *logging::out << logging::Logger::INFO_HIGH << "Done with findFluidNodes()\n";
 }
 
diff --git a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
index 8039aedd1..ad72e1adb 100644
--- a/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
+++ b/src/gpu/GridGenerator/grid/GridBuilder/MultipleGridBuilder.h
@@ -86,7 +86,7 @@ public:
     GRIDGENERATOR_EXPORT void findCommunicationIndices( int direction, LbmOrGks lbmOrGks );
 
     // needed for CUDA Streams MultiGPU
-    void findGeoFluidNodes();
+    void findFluidNodes(bool onlyBulk);
 };
 
 #endif
diff --git a/src/gpu/GridGenerator/grid/GridImp.cu b/src/gpu/GridGenerator/grid/GridImp.cu
index d67d319dc..8bc404c3a 100644
--- a/src/gpu/GridGenerator/grid/GridImp.cu
+++ b/src/gpu/GridGenerator/grid/GridImp.cu
@@ -858,20 +858,19 @@ CUDA_HOST void GridImp::updateSparseIndices()
     sparseSize = size - removedNodes;
 }
 
-CUDA_HOST void GridImp::findFluidNodeIndices() 
+CUDA_HOST void GridImp::findFluidNodeIndices(bool onlyBulk) 
 {
     this->fluidNodeIndices.clear();
     for (uint index = 0; index < this->size; index++) {
         int sparseIndex = this->getSparseIndex(index);
         if (sparseIndex == -1)
             continue;
-
-        if (this->field.isFluid(index))
+        if ((onlyBulk && this->field.isFluidBulk(index)) || (!onlyBulk && this->field.isFluid(index)))
             this->fluidNodeIndices.push_back((uint)sparseIndex + 1);   // + 1 for numbering shift between GridGenerator and VF_GPU
     }
-    this->numberOfFluidNodes = (uint)this->fluidNodeIndices.size();
 }
 
+
 HOSTDEVICE void GridImp::setNeighborIndices(uint index)
 {
     real x, y, z;
@@ -1762,7 +1761,7 @@ HOSTDEVICE uint GridImp::getSparseSize() const
 }
 
 HOSTDEVICE uint GridImp::getNumberOfFluidNodes() const { 
-    return this->numberOfFluidNodes; 
+    return (uint)this->fluidNodeIndices.size(); 
 }
 
 HOSTDEVICE Field GridImp::getField() const
@@ -1958,11 +1957,10 @@ CUDA_HOST void GridImp::getNodeValues(real *xCoords, real *yCoords, real *zCoord
 }
 
 CUDA_HOST void GridImp::getFluidNodeIndices(uint *fluidNodeIndices) const { 
-  for (uint nodeNumber = 0; nodeNumber < this->numberOfFluidNodes; nodeNumber++)
+    for (uint nodeNumber = 0; nodeNumber < (uint)this->fluidNodeIndices.size(); nodeNumber++)
         fluidNodeIndices[nodeNumber] = this->fluidNodeIndices[nodeNumber];
 }
 
-
 void GridImp::print() const
 {
     printf("min: (%2.4f, %2.4f, %2.4f), max: (%2.4f, %2.4f, %2.4f), size: %d, delta: %2.4f\n", startX, startY, startZ,
diff --git a/src/gpu/GridGenerator/grid/GridImp.h b/src/gpu/GridGenerator/grid/GridImp.h
index 595698093..33953ab2a 100644
--- a/src/gpu/GridGenerator/grid/GridImp.h
+++ b/src/gpu/GridGenerator/grid/GridImp.h
@@ -87,7 +87,6 @@ private:
     int *sparseIndices;
 
     std::vector<uint> fluidNodeIndices;
-    uint numberOfFluidNodes;
 
 	uint *qIndices;     //maps from matrix index to qIndex
 	real *qValues;
@@ -316,7 +315,7 @@ public:
 
     void repairCommunicationInices(int direction) override;
 
-    void findFluidNodeIndices() override;
+    void findFluidNodeIndices(bool onlyBulk) override;
     uint getNumberOfFluidNodes() const override;
     CUDA_HOST void getFluidNodeIndices(uint *fluidNodeIndices) const override;
 
-- 
GitLab