From 75f5d30900a252332d5292e1cdea5bafbecc34fd Mon Sep 17 00:00:00 2001
From: Soeren Peters <peters@irmb.tu-bs.de>
Date: Mon, 28 May 2018 14:57:16 +0200
Subject: [PATCH] - in Side: ignore first or last node row if the side is
 already set - in side: add 1 to sparseIndex concerning to martins indices

---
 .../grid/BoundaryConditions/Side.cpp          | 161 +++++++++++++++---
 .../grid/BoundaryConditions/Side.h            |  34 +++-
 .../grid/GridBuilder/LevelGridBuilder.cpp     |  12 +-
 .../grid/GridBuilder/LevelGridBuilder.h       |   2 +
 .../grid/GridBuilder/MultipleGridBuilder.cpp  |  10 +-
 .../DataStructureInitializer/GridProvider.cpp |   9 +
 .../GridReaderGenerator/GridGenerator.cpp     |  57 +++++--
 src/VirtualFluids_GPU/LBM/Simulation.cpp      |  18 +-
 targets/apps/HULC/main.cpp                    |  19 +--
 9 files changed, 259 insertions(+), 63 deletions(-)

diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
index 01147ead2..e3c7d537c 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.cpp
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp
@@ -8,13 +8,13 @@
 void Side::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::string coord, real constant,
                       real startInner, real endInner, real startOuter, real endOuter)
 {
-    for (real v1 = startInner; v1 < endInner; v1 += grid->getDelta())
+    for (real v1 = startInner; v1 <= endInner; v1 += grid->getDelta())
     {
-        for (real v2 = startOuter; v2 < endOuter; v2 += grid->getDelta())
+        for (real v2 = startOuter; v2 <= endOuter; v2 += grid->getDelta())
         {
             uint index = getIndex(grid, coord, constant, v1, v2);
             if (grid->getFieldEntry(index) == FLUID)
-                boundaryCondition->indices.push_back(index);
+                boundaryCondition->indices.push_back(grid->getSparseIndex(index) + 1);
         }
     }
 }
@@ -30,15 +30,44 @@ uint Side::getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1,
     return -1;
 }
 
+void Geometry::setPeriodicy(SPtr<Grid> grid)
+{
+
+}
+
+void Geometry::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
+{
+
+}
+
 void MX::setPeriodicy(SPtr<Grid> grid)
 {
     grid->setPeriodicityX(false);
 }
 
-void MX::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition)
+void MX::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
 {
-    Side::addIndices(grid, boundaryCondition, "x", grid->getStartX() + grid->getDelta(), grid->getStartY(),
-                     grid->getEndY(), grid->getStartZ(), grid->getEndZ());
+    real startInner = grid->getStartY();
+    real endInner = grid->getEndY();
+
+    real startOuter = grid->getStartZ();
+    real endOuter = grid->getEndZ();
+
+    if (sideIsSet[SideType::MY])
+        startInner += grid->getDelta();
+
+    if (sideIsSet[SideType::PY])
+        endInner -= grid->getDelta();
+
+    if (sideIsSet[SideType::MZ])
+        startOuter += grid->getDelta();
+
+    if (sideIsSet[SideType::PZ])
+        endOuter -= grid->getDelta();
+
+
+    Side::addIndices(grid, boundaryCondition, "x", grid->getStartX() + grid->getDelta(), startInner,
+        endInner, startOuter, endOuter);
 }
 
 void PX::setPeriodicy(SPtr<Grid> grid)
@@ -46,10 +75,28 @@ void PX::setPeriodicy(SPtr<Grid> grid)
     grid->setPeriodicityX(false);
 }
 
-void PX::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition)
+void PX::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
 {
-    Side::addIndices(grid, boundaryCondition, "x", grid->getEndX() - grid->getDelta(), grid->getStartY(),
-                     grid->getEndY(), grid->getStartZ(), grid->getEndZ());
+    real startInner = grid->getStartY();
+    real endInner = grid->getEndY();
+
+    real startOuter = grid->getStartZ();
+    real endOuter = grid->getEndZ();
+
+    if (sideIsSet[SideType::MY])
+        startInner += grid->getDelta();
+
+    if (sideIsSet[SideType::PY])
+        endInner -= grid->getDelta();
+
+    if (sideIsSet[SideType::MZ])
+        startOuter += grid->getDelta();
+
+    if (sideIsSet[SideType::PZ])
+        endOuter -= grid->getDelta();
+
+    Side::addIndices(grid, boundaryCondition, "x", grid->getEndX() - grid->getDelta(), startInner,
+        endInner, startOuter, endOuter);
 }
 
 void MY::setPeriodicy(SPtr<Grid> grid)
@@ -57,10 +104,28 @@ void MY::setPeriodicy(SPtr<Grid> grid)
     grid->setPeriodicityY(false);
 }
 
-void MY::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition)
+void MY::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
 {
-    Side::addIndices(grid, boundaryCondition, "y", grid->getStartY() + grid->getDelta(), grid->getStartX(),
-                     grid->getEndX(), grid->getStartZ(), grid->getEndZ());
+    real startInner = grid->getStartX();
+    real endInner = grid->getEndX();
+
+    real startOuter = grid->getStartZ();
+    real endOuter = grid->getEndZ();
+
+    if (sideIsSet[SideType::MX])
+        startInner += grid->getDelta();
+
+    if (sideIsSet[SideType::PX])
+        endInner -= grid->getDelta();
+
+    if (sideIsSet[SideType::MZ])
+        startOuter += grid->getDelta();
+
+    if (sideIsSet[SideType::PZ])
+        endOuter -= grid->getDelta();
+
+    Side::addIndices(grid, boundaryCondition, "y", grid->getStartY() + grid->getDelta(), startInner,
+        endInner, startOuter, endOuter);
 }
 
 void PY::setPeriodicy(SPtr<Grid> grid)
@@ -68,10 +133,28 @@ void PY::setPeriodicy(SPtr<Grid> grid)
     grid->setPeriodicityY(false);
 }
 
-void PY::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition)
+void PY::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
 {
-    Side::addIndices(grid, boundaryCondition, "y", grid->getEndY() - grid->getDelta(), grid->getStartX(),
-                     grid->getEndX(), grid->getStartZ(), grid->getEndZ());
+    real startInner = grid->getStartX();
+    real endInner = grid->getEndX();
+
+    real startOuter = grid->getStartZ();
+    real endOuter = grid->getEndZ();
+
+    if (sideIsSet[SideType::MX])
+        startInner += grid->getDelta();
+
+    if (sideIsSet[SideType::PX])
+        endInner -= grid->getDelta();
+
+    if (sideIsSet[SideType::MZ])
+        startOuter += grid->getDelta();
+
+    if (sideIsSet[SideType::PZ])
+        endOuter -= grid->getDelta();
+
+    Side::addIndices(grid, boundaryCondition, "y", grid->getEndY() - grid->getDelta(), startInner,
+        endInner, startOuter, endOuter);
 }
 
 void MZ::setPeriodicy(SPtr<Grid> grid)
@@ -79,10 +162,28 @@ void MZ::setPeriodicy(SPtr<Grid> grid)
     grid->setPeriodicityZ(false);
 }
 
-void MZ::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition)
+void MZ::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
 {
-    Side::addIndices(grid, boundaryCondition, "z", grid->getStartZ() + grid->getDelta(), grid->getStartX(),
-                     grid->getEndX(), grid->getStartY(), grid->getEndY());
+    real startInner = grid->getStartX();
+    real endInner = grid->getEndX();
+
+    real startOuter = grid->getStartY();
+    real endOuter = grid->getEndY();
+
+    if (sideIsSet[SideType::MX])
+        startInner += grid->getDelta();
+
+    if (sideIsSet[SideType::PX])
+        endInner -= grid->getDelta();
+
+    if (sideIsSet[SideType::MY])
+        startOuter += grid->getDelta();
+
+    if (sideIsSet[SideType::PY])
+        endOuter -= grid->getDelta();
+
+    Side::addIndices(grid, boundaryCondition, "z", grid->getStartZ() + grid->getDelta(), startInner,
+        endInner, startOuter, endOuter);
 }
 
 void PZ::setPeriodicy(SPtr<Grid> grid)
@@ -90,8 +191,26 @@ void PZ::setPeriodicy(SPtr<Grid> grid)
     grid->setPeriodicityZ(false);
 }
 
-void PZ::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition)
+void PZ::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet)
 {
-    Side::addIndices(grid, boundaryCondition, "z", grid->getEndZ() - grid->getDelta(), grid->getStartX(),
-                     grid->getEndX(), grid->getStartY(), grid->getEndY());
+    real startInner = grid->getStartX();
+    real endInner = grid->getEndX();
+
+    real startOuter = grid->getStartY();
+    real endOuter = grid->getEndY();
+
+    if (sideIsSet[SideType::MX])
+        startInner += grid->getDelta();
+
+    if (sideIsSet[SideType::PX])
+        endInner -= grid->getDelta();
+
+    if (sideIsSet[SideType::MY])
+        startOuter += grid->getDelta();
+
+    if (sideIsSet[SideType::PY])
+        endOuter -= grid->getDelta();
+
+    Side::addIndices(grid, boundaryCondition, "z", grid->getEndZ() - grid->getDelta(), startInner,
+        endInner, startOuter, endOuter);
 }
diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.h b/src/GridGenerator/grid/BoundaryConditions/Side.h
index cbd28dffe..7eaac59cc 100644
--- a/src/GridGenerator/grid/BoundaryConditions/Side.h
+++ b/src/GridGenerator/grid/BoundaryConditions/Side.h
@@ -7,6 +7,7 @@
 
 #include <core/PointerDefinitions.h>
 #include <core/DataTypes.h>
+#include <map>
 
 #define X_INDEX 0
 #define Y_INDEX 1
@@ -22,7 +23,7 @@ class Side;
 
 enum class SideType
 {
-    MX, PX, MY, PY, MZ, PZ
+    MX, PX, MY, PY, MZ, PZ, GEOMETRY
 };
 
 
@@ -30,7 +31,7 @@ enum class SideType
 class Side
 {
 public:
-    virtual void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) = 0;
+    virtual void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) = 0;
     virtual void setPeriodicy(SPtr<Grid> grid) = 0;
 
     virtual int getCoordinate() const = 0;
@@ -44,11 +45,28 @@ private:
     static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2);
 };
 
+class Geometry : public Side
+{
+public:
+    void setPeriodicy(SPtr<Grid> grid) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
+
+    int getCoordinate() const override
+    {
+        return X_INDEX;
+    }
+
+    int getDirection() const override
+    {
+        return NEGATIVE_DIR;
+    }
+};
+
 class MX : public Side
 {
 public:
     void setPeriodicy(SPtr<Grid> grid) override;
-    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
 
     int getCoordinate() const override
     {
@@ -66,7 +84,7 @@ class PX : public Side
 public:
     void setPeriodicy(SPtr<Grid> grid) override;
 
-    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
 
     int getCoordinate() const override
     {
@@ -85,7 +103,7 @@ class MY : public Side
 public:
     void setPeriodicy(SPtr<Grid> grid) override;
 
-    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
 
     int getCoordinate() const override
     {
@@ -103,7 +121,7 @@ class PY : public Side
 public:
     void setPeriodicy(SPtr<Grid> grid) override;
 
-    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
 
     int getCoordinate() const override
     {
@@ -122,7 +140,7 @@ class MZ : public Side
 public:
     void setPeriodicy(SPtr<Grid> grid) override;
 
-    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
 
     int getCoordinate() const override
     {
@@ -140,7 +158,7 @@ class PZ : public Side
 public:
     void setPeriodicy(SPtr<Grid> grid) override;
 
-    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition) override;
+    void addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondition, std::map<SideType, bool> sideIsSet) override;
 
     int getCoordinate() const override
     {
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
index 66f9f83d8..718f17561 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp
@@ -44,6 +44,10 @@ LevelGridBuilder::LevelGridBuilder(Device device, const std::string& d3qxx) : de
     channelBoundaryConditions[3] = "periodic";
     channelBoundaryConditions[4] = "periodic";
     channelBoundaryConditions[5] = "periodic";
+
+
+    sideIsSet = { { SideType::MX, false },{ SideType::PX, false },{ SideType::MY, false },{ SideType::PY, false },{ SideType::MZ, false },{ SideType::PZ, false } };
+
 }
 
 std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(Device device, const std::string& d3qxx)
@@ -53,6 +57,8 @@ std::shared_ptr<LevelGridBuilder> LevelGridBuilder::makeShared(Device device, co
 
 void LevelGridBuilder::setVelocityBoundaryCondition(SideType sideType, real vx, real vy, real vz)
 {
+    sideIsSet[sideType] = true;
+
     SPtr<VelocityBoundaryCondition> velocityBoundaryCondition = VelocityBoundaryCondition::make(vx, vy, vz);
 
     auto side = SideFactory::make(sideType);
@@ -64,7 +70,10 @@ void LevelGridBuilder::setVelocityBoundaryCondition(SideType sideType, real vx,
 
 void LevelGridBuilder::setPressureBoundaryCondition(SideType sideType, real rho)
 {
+    sideIsSet[sideType] = true;
+
     SPtr<PressureBoundaryCondition> pressureBoundaryCondition = PressureBoundaryCondition::make(rho);
+
     auto side = SideFactory::make(sideType);
 
     side->setPeriodicy(grids[0]);
@@ -239,7 +248,8 @@ void LevelGridBuilder::getVelocityValues(real* vx, real* vy, real* vz, int* indi
     {
         for(int i = 0; i < boundaryCondition->indices.size(); i++)
         {
-            indices[allIndicesCounter] = boundaryCondition->indices[i];
+            indices[allIndicesCounter] = boundaryCondition->indices[i];  
+
             vx[allIndicesCounter] = boundaryCondition->vx;
             vy[allIndicesCounter] = boundaryCondition->vy;
             vz[allIndicesCounter] = boundaryCondition->vz;
diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
index ce6626012..68f3636ed 100644
--- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
+++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.h
@@ -81,6 +81,8 @@ protected:
     std::vector<std::shared_ptr<Grid> > grids;
     std::vector<std::vector<std::vector<real> > > Qs;
     std::vector<std::string> channelBoundaryConditions;
+
+    std::map<SideType, bool> sideIsSet;
     std::vector<SPtr<VelocityBoundaryCondition> > velocityBoundaryConditions;
     std::vector<SPtr<PressureBoundaryCondition> > pressureBoundaryConditions;
 
diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
index c9c05c39a..928ce9971 100644
--- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
+++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp
@@ -256,7 +256,7 @@ void MultipleGridBuilder::buildGrids()
     for (auto grid : grids)
         grid->inital();
 
-    grids[grids.size()-1]->mesh(solidObject);
+    //grids[grids.size()-1]->mesh(solidObject);
 
     for (size_t i = 0; i < grids.size() - 1; i++)
         grids[i]->findGridInterface(grids[i + 1]);
@@ -270,8 +270,14 @@ void MultipleGridBuilder::buildGrids()
 
     for(auto velocityBC : velocityBoundaryConditions)
     {
-        velocityBC->side->addIndices(grids[0], velocityBC);
+        velocityBC->side->addIndices(grids[0], velocityBC, sideIsSet);
     }
+
+    for (auto pressureBC : pressureBoundaryConditions)
+    {
+        pressureBC->side->addIndices(grids[0], pressureBC, sideIsSet);
+    }
+
 }
 
 
diff --git a/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
index 0e23e6957..8c92cd064 100644
--- a/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
+++ b/src/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp
@@ -72,6 +72,15 @@ void GridProvider::setInitalNodeValues(const int numberOfNodes, const int level)
             para->getParH(level)->gDyvz[j] = 0.0f;
             para->getParH(level)->gDzvz[j] = 0.0f;
         }
+
+
+
+        para->getParH(level)->rho_SP[j] = 0.0;
+
+        para->getParH(level)->vx_SP[j] = 0.0;
+        para->getParH(level)->vy_SP[j] = 0.0;
+        para->getParH(level)->vz_SP[j] = 0.0;
+
     }
 	////////////////////////////////////////////////////////////////////////////////
 	//2D parabolic test for turbulent channel flow
diff --git a/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
index b80699bb1..37d643992 100644
--- a/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
+++ b/src/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp
@@ -124,34 +124,63 @@ void GridGenerator::allocArrays_CoordNeighborGeo()
 void GridGenerator::allocArrays_BoundaryValues()
 {
 	std::cout << "------read BoundaryValues------" << std::endl;
+
+    for (int level = 0; level < builder->getNumberOfGridLevels(); level++) {
+        const auto numberOfPressureValues = int(builder->getPressureSize(level));
+
+        cout << "size pressure level " << level << " : " << numberOfPressureValues << endl;
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        para->getParH(level)->QPress.kQ = numberOfPressureValues;
+        para->getParD(level)->QPress.kQ = numberOfPressureValues;
+        para->getParH(level)->kPressQread = numberOfPressureValues * para->getD3Qxx();
+        para->getParD(level)->kPressQread = numberOfPressureValues * para->getD3Qxx();
+        if (numberOfPressureValues > 1)
+        {
+            para->cudaAllocPress(level);
+            builder->getPressureValues(para->getParH(level)->QPress.RhoBC, para->getParH(level)->QPress.k, level);
+            para->cudaCopyPress(level);
+        }
+    }
     
+
     for (uint level = 0; level < builder->getNumberOfGridLevels(); level++) {
         const auto numberOfVelocityValues = int(builder->getVelocitySize(level));
+        cout << "size velocity level " << level << " : " << numberOfVelocityValues << endl;
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        int blocks = (numberOfVelocityValues / para->getParH(level)->numberofthreads) + 1;
+        para->getParH(level)->Qinflow.kArray = blocks * para->getParH(level)->numberofthreads;
+        para->getParD(level)->Qinflow.kArray = para->getParH(level)->Qinflow.kArray;
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        para->getParH(level)->Qinflow.kQ = numberOfVelocityValues;
+        para->getParD(level)->Qinflow.kQ = numberOfVelocityValues;
+        para->getParH(level)->kInflowQ = numberOfVelocityValues;
+        para->getParD(level)->kInflowQ = numberOfVelocityValues;
+        para->getParH(level)->kInflowQread = numberOfVelocityValues * para->getD3Qxx();
+        para->getParD(level)->kInflowQread = numberOfVelocityValues * para->getD3Qxx();
+
         if (numberOfVelocityValues > 1)
         {
-            cout << "size velocity level " << level << " : " << numberOfVelocityValues << endl;
-            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-            int blocks = (numberOfVelocityValues / para->getParH(level)->numberofthreads) + 1;
-            para->getParH(level)->Qinflow.kArray = blocks * para->getParH(level)->numberofthreads;
-            para->getParD(level)->Qinflow.kArray = para->getParH(level)->Qinflow.kArray;
-            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-            para->getParH(level)->Qinflow.kQ = numberOfVelocityValues;
-            para->getParD(level)->Qinflow.kQ = numberOfVelocityValues;
-            para->getParH(level)->kInflowQ = numberOfVelocityValues;
-            para->getParD(level)->kInflowQ = numberOfVelocityValues;
-            para->getParH(level)->kInflowQread = numberOfVelocityValues * para->getD3Qxx();
-            para->getParD(level)->kInflowQread = numberOfVelocityValues * para->getD3Qxx();
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             para->cudaAllocVeloBC(level);
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
             builder->getVelocityValues(para->getParH(level)->Qinflow.Vx, para->getParH(level)->Qinflow.Vy, para->getParH(level)->Qinflow.Vz, para->getParH(level)->Qinflow.k, level);
 
-            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-            para->cudaCopyVeloBC(level);
+            //for (int i = 0; i < numberOfVelocityValues; i++)
+            //{
+            //    std::cout << "index: " << para->getParH(level)->Qinflow.k[i];
+            //    std::cout << " (x,y,z)" << para->getParH(level)->coordX_SP[para->getParH(level)->Qinflow.k[i]];
+            //    std::cout << ", " << para->getParH(level)->coordY_SP[para->getParH(level)->Qinflow.k[i]];
+            //    std::cout << ", " << para->getParH(level)->coordZ_SP[para->getParH(level)->Qinflow.k[i]];
+            //    std::cout << " geo: " << para->getParH(level)->geoSP[para->getParH(level)->Qinflow.k[i]];
+            //    std::cout << std::endl;
+            //}
+
 
+            ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
+            para->cudaCopyVeloBC(level);
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
             // advection - diffusion stuff
diff --git a/src/VirtualFluids_GPU/LBM/Simulation.cpp b/src/VirtualFluids_GPU/LBM/Simulation.cpp
index a57d31274..06e5521d1 100644
--- a/src/VirtualFluids_GPU/LBM/Simulation.cpp
+++ b/src/VirtualFluids_GPU/LBM/Simulation.cpp
@@ -1197,13 +1197,17 @@ void Simulation::run()
 							//para->getParD(0)->neighborX_SP,    para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
 							//para->getParD(0)->size_Mat_SP,     para->getParD(0)->evenOrOdd);
 		     // getLastCudaError("QVelDevComp27 execution failed");
-		      QVelDevCompZeroPress27(para->getParD(0)->numberofthreads, para->getParD(0)->nx,             para->getParD(0)->ny,
-									 para->getParD(0)->Qinflow.Vx,      para->getParD(0)->Qinflow.Vy,     para->getParD(0)->Qinflow.Vz,
-									 para->getParD(0)->d0SP.f[0],       para->getParD(0)->Qinflow.k,      para->getParD(0)->Qinflow.q27[0], 
-									 para->getParD(0)->kInflowQ,        para->getParD(0)->Qinflow.kArray, para->getParD(0)->omega,
-									 para->getParD(0)->neighborX_SP,    para->getParD(0)->neighborY_SP,   para->getParD(0)->neighborZ_SP,
-									 para->getParD(0)->size_Mat_SP,     para->getParD(0)->evenOrOdd);
-		      getLastCudaError("QVelDevComp27 execution failed");
+        if (para->getParD(0)->kInflowQ > 0)
+        {
+            QVelDevCompZeroPress27(para->getParD(0)->numberofthreads, para->getParD(0)->nx, para->getParD(0)->ny,
+                para->getParD(0)->Qinflow.Vx, para->getParD(0)->Qinflow.Vy, para->getParD(0)->Qinflow.Vz,
+                para->getParD(0)->d0SP.f[0], para->getParD(0)->Qinflow.k, para->getParD(0)->Qinflow.q27[0],
+                para->getParD(0)->kInflowQ, para->getParD(0)->Qinflow.kArray, para->getParD(0)->omega,
+                para->getParD(0)->neighborX_SP, para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP,
+                para->getParD(0)->size_Mat_SP, para->getParD(0)->evenOrOdd);
+            getLastCudaError("QVelDevComp27 execution failed");
+        }
+
 
 			  ////////////////////////////////////////////////////////////////////////////
 		      //QVeloDevEQ27(para->getParD(0)->numberofthreads,
diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp
index 10467ee6d..e88f3aa4f 100644
--- a/targets/apps/HULC/main.cpp
+++ b/targets/apps/HULC/main.cpp
@@ -276,17 +276,15 @@ void multipleLevel(const std::string& configPath)
 
     TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl");
 
-    gridBuilder->addGeometry(triangularMesh);
+    //gridBuilder->addGeometry(triangularMesh);
 
-
-    gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.01, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.01, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::MY, 0.01, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::PY, 0.01, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::MZ, 0.01, 0.0, 0.0);
-    gridBuilder->setVelocityBoundaryCondition(SideType::PZ, 0.01, 0.0, 0.0);
-
-    //gridBuilder->setBoundaryCondition("geometry", BoundaryCondition::VELOCITY);
+    gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.001, 0.0, 0.0);
+    gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0);
+    //gridBuilder->setVelocityBoundaryCondition(SideType::PX, 0.001, 0.0, 0.0);
+    //gridBuilder->setVelocityBoundaryCondition(SideType::MY, 0.001, 0.0, 0.0);
+    //gridBuilder->setVelocityBoundaryCondition(SideType::PY, 0.001, 0.0, 0.0);
+    //gridBuilder->setVelocityBoundaryCondition(SideType::MZ, 0.001, 0.0, 0.0);
+    //gridBuilder->setVelocityBoundaryCondition(SideType::PZ, 0.001, 0.0, 0.0);
 
 
     //TriangleOffsetSurfaceGeneration::createOffsetTriangularMesh(triangularMesh, 5);
@@ -310,6 +308,7 @@ void multipleLevel(const std::string& configPath)
     //gridBuilder->writeGridToVTK("D:/GRIDGENERATION/gridTest_level_2", 2);
 
     gridBuilder->buildGrids();
+    //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII);
 
     //gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");
 
-- 
GitLab