From c0a6a874f623c5c7f4d9eaabbe19eafbeccaec16 Mon Sep 17 00:00:00 2001
From: Anna Wellmann <a.wellmann@tu-bs.de>
Date: Mon, 4 Jul 2022 12:23:28 +0000
Subject: [PATCH] Add pressure bc to BoundaryConditionFactory

---
 apps/gpu/LBM/Sphere/Sphere.cpp                |   2 +
 .../BoundaryConditionFactory.cpp              |  29 ++
 .../BoundaryConditionFactory.h                |  19 +-
 src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h |  79 +---
 src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu    | 345 ++++++------------
 .../KernelManager/LBKernelManager.cpp         |  92 +----
 .../KernelManager/LBKernelManager.h           |   1 +
 7 files changed, 166 insertions(+), 401 deletions(-)

diff --git a/apps/gpu/LBM/Sphere/Sphere.cpp b/apps/gpu/LBM/Sphere/Sphere.cpp
index 355859760..3f4ff459c 100644
--- a/apps/gpu/LBM/Sphere/Sphere.cpp
+++ b/apps/gpu/LBM/Sphere/Sphere.cpp
@@ -172,10 +172,12 @@ void multipleLevel(const std::string &configPath)
     gridBuilder->setSlipBoundaryCondition(SideType::PZ, 0.0, 0.0, 0.0);
     gridBuilder->setSlipBoundaryCondition(SideType::MZ, 0.0, 0.0, 0.0);
     gridBuilder->setVelocityBoundaryCondition(SideType::GEOMETRY, 0.0, 0.0, 0.0);
+    gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); // set pressure boundary condition last
 
     bcFactory.setNoSlipBoundaryCondition(BoundaryConditionFactory::NoSlipBC::NoSlipCompressible);
     bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityCompressible);
     bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipCompressible);
+    bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::PressureNonEquilibriumCompressible);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp
index 2d97f1998..d9ce7853d 100644
--- a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp
+++ b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp
@@ -18,6 +18,11 @@ void BoundaryConditionFactory::setSlipBoundaryCondition(const SlipBC boundaryCon
     this->slipBoundaryCondition = boundaryConditionType;
 }
 
+void BoundaryConditionFactory::setPressureBoundaryCondition(const PressureBC boundaryConditionType)
+{
+    this->pressureBoundaryCondition = boundaryConditionType;
+}
+
 boundaryCondition BoundaryConditionFactory::getVelocityBoundaryConditionPost() const
 {
     // for descriptions of the boundary conditions refer to the header
@@ -75,6 +80,30 @@ boundaryCondition BoundaryConditionFactory::getSlipBoundaryConditionPost() const
     }
 }
 
+boundaryCondition BoundaryConditionFactory::getPressureBoundaryConditionPre() const
+{
+    // for descriptions of the boundary conditions refer to the header
+    switch (this->pressureBoundaryCondition) {
+        case PressureBC::PressureEquilibrium:
+            return QPressDev27;
+            break;
+        case PressureBC::PressureEquilibrium2:
+            return QPressDevEQZ27;
+            break;
+        case PressureBC::PressureNonEquilibriumIncompressible:
+            return QPressDevIncompNEQ27;
+            break;
+        case PressureBC::PressureNonEquilibriumCompressible:
+            return QPressDevNEQ27;
+            break;
+        case PressureBC::OutflowNonReflective:
+            return QPressNoRhoDev27;
+            break;
+        default:
+            return nullptr;
+    }
+}
+
 // boundaryCondition BoundaryConditionFactory::getGeometryBoundaryConditionPost() const{
 //     this->getNoSlipBoundaryConditionPost();
 // }
\ No newline at end of file
diff --git a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h
index 150bfcf0b..a09b8e322 100644
--- a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h
+++ b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h
@@ -44,16 +44,31 @@ public:
         //! - SlipCompressible = interpolated slip boundary condition, based on subgrid distances
         SlipCompressible,
         //! - SlipCompressible = interpolated slip boundary condition, based on subgrid distances.
-        //! With turbulent viscosity
+        //! With turbulent viscosity -> para->setUseTurbulentViscosity(true) has to be set to true
         SlipCompressibleTurbulentViscosity
     };
 
+    //! \brief An enumeration for selecting a pressure boundary condition
+    enum class PressureBC {
+        //! - PressureEquilibrium = pressure boundary condition based on equilibrium
+        PressureEquilibrium, // incorrect pressure :(
+        //! - PressureEquilibrium2 = pressure boundary condition based on equilibrium (potentially better?! than PressureEquilibrium)
+        PressureEquilibrium2, // is broken --> nan :(
+        //! - PressureNonEquilibriumIncompressible = pressure boundary condition based on non-equilibrium
+        PressureNonEquilibriumIncompressible,
+        //! - PressureNonEquilibriumCompressible = pressure boundary condition based on non-equilibrium
+        PressureNonEquilibriumCompressible,
+        //! - OutflowNonReflective = outflow boundary condition
+        OutflowNonReflective
+    };
+
     // enum class OutflowBoundaryCondition {};  // TODO:
     // https://git.rz.tu-bs.de/m.schoenherr/VirtualFluids_dev/-/issues/16
 
     void setVelocityBoundaryCondition(const VelocityBC boundaryConditionType);
     void setNoSlipBoundaryCondition(const NoSlipBC boundaryConditionType);
     void setSlipBoundaryCondition(const SlipBC boundaryConditionType);
+    void setPressureBoundaryCondition(const PressureBC boundaryConditionType);
     // void setGeometryBoundaryCondition(const std::variant<VelocityBC, NoSlipBC, SlipBC> boundaryConditionType);
 
     // void setOutflowBoundaryCondition(...); // TODO:
@@ -62,11 +77,13 @@ public:
     boundaryCondition getVelocityBoundaryConditionPost() const;
     boundaryCondition getNoSlipBoundaryConditionPost() const;
     boundaryCondition getSlipBoundaryConditionPost() const;
+    boundaryCondition getPressureBoundaryConditionPre() const;
 
 private:
     VelocityBC velocityBoundaryCondition;
     NoSlipBC noSlipBoundaryCondition;
     SlipBC slipBoundaryCondition;
+    PressureBC pressureBoundaryCondition;
 
     // OutflowBoundaryConditon outflowBC // TODO: https://git.rz.tu-bs.de/m.schoenherr/VirtualFluids_dev/-/issues/16
 };
diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
index 8e260bdbf..d007b6e59 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
+++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h
@@ -938,18 +938,7 @@ extern "C" void BBStressDev27(  unsigned int numberOfThreads,
 								unsigned int size_Mat, 
 								bool isEvenTimestep);
 
-extern "C" void QPressDev27(unsigned int numberOfThreads,
-                          real* rhoBC,
-                          real* DD, 
-                          int* k_Q, 
-                          real* QQ,
-                          unsigned int numberOfBCnodes, 
-                          real om1, 
-                          unsigned int* neighborX,
-                          unsigned int* neighborY,
-                          unsigned int* neighborZ,
-                          unsigned int size_Mat, 
-                          bool isEvenTimestep);
+extern "C" void QPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
 extern "C" void QPressDevFixBackflow27(unsigned int numberOfThreads,
                                        real* rhoBC,
@@ -975,31 +964,9 @@ extern "C" void QPressDevDirDepBot27(unsigned int numberOfThreads,
                                      unsigned int size_Mat, 
                                      bool isEvenTimestep);
 
-extern "C" void QPressNoRhoDev27(  unsigned int numberOfThreads,
-								   real* rhoBC,
-								   real* DD, 
-								   int* k_Q, 
-								   int* k_N, 
-								   unsigned int numberOfBCnodes, 
-								   real om1, 
-								   unsigned int* neighborX,
-								   unsigned int* neighborY,
-								   unsigned int* neighborZ,
-								   unsigned int size_Mat, 
-								   bool isEvenTimestep);
+extern "C" void QPressNoRhoDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
-extern "C" void QInflowScaleByPressDev27(unsigned int numberOfThreads,
-										 real* rhoBC,
-										 real* DD, 
-										 int* k_Q, 
-										 int* k_N, 
-										 unsigned int numberOfBCnodes, 
-										 real om1, 
-										 unsigned int* neighborX,
-										 unsigned int* neighborY,
-										 unsigned int* neighborZ,
-										 unsigned int size_Mat, 
-										 bool isEvenTimestep);
+extern "C" void QInflowScaleByPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
 extern "C" void QPressDevOld27(unsigned int numberOfThreads,
                                real* rhoBC,
@@ -1014,45 +981,11 @@ extern "C" void QPressDevOld27(unsigned int numberOfThreads,
                                unsigned int size_Mat, 
                                bool isEvenTimestep);
 
-extern "C" void QPressDevIncompNEQ27(unsigned int numberOfThreads,
-									 real* rhoBC,
-									 real* DD, 
-									 int* k_Q, 
-									 int* k_N, 
-									 unsigned int numberOfBCnodes, 
-									 real om1, 
-									 unsigned int* neighborX,
-									 unsigned int* neighborY,
-									 unsigned int* neighborZ,
-									 unsigned int size_Mat, 
-									 bool isEvenTimestep);
+extern "C" void QPressDevIncompNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
-extern "C" void QPressDevNEQ27(unsigned int numberOfThreads,
-							   real* rhoBC,
-							   real* distribution, 
-							   int* bcNodeIndices, 
-							   int* bcNeighborIndices, 
-							   unsigned int numberOfBCnodes, 
-							   real omega1, 
-							   unsigned int* neighborX,
-							   unsigned int* neighborY,
-							   unsigned int* neighborZ,
-							   unsigned int size_Mat, 
-							   bool isEvenTimestep);
+extern "C" void QPressDevNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
-extern "C" void QPressDevEQZ27(unsigned int numberOfThreads,
-							   real* rhoBC,
-							   real* DD, 
-							   int* k_Q, 
-							   int* k_N, 
-							   real* kTestRE, 
-							   unsigned int numberOfBCnodes, 
-							   real om1, 
-							   unsigned int* neighborX,
-							   unsigned int* neighborY,
-							   unsigned int* neighborZ,
-							   unsigned int size_Mat, 
-							   bool isEvenTimestep);
+extern "C" void QPressDevEQZ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition);
 
 extern "C" void QPressDevZero27(unsigned int numberOfThreads,
                                 real* DD, 
diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
index db41645a0..c4b439f80 100644
--- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
+++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu
@@ -3670,46 +3670,24 @@ extern "C" void BBStressDev27(unsigned int numberOfThreads,
       getLastCudaError("BBStressDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QPressDev27(unsigned int numberOfThreads,
-                             real* rhoBC,
-                             real* DD,
-                             int* k_Q,
-                             real* QQ,
-                             unsigned int numberOfBCnodes,
-                             real om1,
-                             unsigned int* neighborX,
-                             unsigned int* neighborY,
-                             unsigned int* neighborZ,
-                             unsigned int size_Mat,
-                             bool isEvenTimestep)
+extern "C" void QPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QPressDevice27<<< gridQ, threads >>> ( rhoBC,
-                                             DD,
-                                             k_Q,
-                                             QQ,
-                                             numberOfBCnodes,
-                                             om1,
-                                             neighborX,
-                                             neighborY,
-                                             neighborZ,
-                                             size_Mat,
-                                             isEvenTimestep);
-      getLastCudaError("QPressDevice27 execution failed");
+   QPressDevice27<<< grid, threads >>> (
+      boundaryCondition->RhoBC,
+      parameterDevice->distributions.f[0],
+      boundaryCondition->k,
+      boundaryCondition->q27[0],
+      boundaryCondition->numberOfBCnodes,
+      parameterDevice->omega,
+      parameterDevice->neighborX,
+      parameterDevice->neighborY,
+      parameterDevice->neighborZ,
+      parameterDevice->numberOfNodes,
+      parameterDevice->isEvenTimestep);
+   getLastCudaError("QPressDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 extern "C" void QPressDevAntiBB27(  unsigned int numberOfThreads,
@@ -3840,87 +3818,43 @@ extern "C" void QPressDevDirDepBot27(  unsigned int numberOfThreads,
       getLastCudaError("QPressDeviceDirDepBot27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QPressNoRhoDev27(unsigned int numberOfThreads,
-                                 real* rhoBC,
-                                 real* DD,
-                                 int* k_Q,
-                                 int* k_N,
-                                 unsigned int numberOfBCnodes,
-                                 real om1,
-                                 unsigned int* neighborX,
-                                 unsigned int* neighborY,
-                                 unsigned int* neighborZ,
-                                 unsigned int size_Mat,
-                                 bool isEvenTimestep)
+extern "C" void QPressNoRhoDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QPressNoRhoDevice27<<< gridQ, threads >>> (   rhoBC,
-													DD,
-													k_Q,
-													k_N,
-													numberOfBCnodes,
-													om1,
-													neighborX,
-													neighborY,
-													neighborZ,
-													size_Mat,
-													isEvenTimestep);
-      getLastCudaError("QPressNoRhoDevice27 execution failed");
+   QPressNoRhoDevice27<<< grid, threads >>> (
+         boundaryCondition->RhoBC,
+         parameterDevice->distributions.f[0],
+         boundaryCondition->k,
+         boundaryCondition->kN,
+         boundaryCondition->numberOfBCnodes,
+         parameterDevice->omega,
+         parameterDevice->neighborX,
+         parameterDevice->neighborY,
+         parameterDevice->neighborZ,
+         parameterDevice->numberOfNodes,
+         parameterDevice->isEvenTimestep);
+   getLastCudaError("QPressNoRhoDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QInflowScaleByPressDev27(unsigned int numberOfThreads,
-										 real* rhoBC,
-										 real* DD,
-										 int* k_Q,
-										 int* k_N,
-										 unsigned int numberOfBCnodes,
-										 real om1,
-										 unsigned int* neighborX,
-										 unsigned int* neighborY,
-										 unsigned int* neighborZ,
-										 unsigned int size_Mat,
-										 bool isEvenTimestep)
+extern "C" void QInflowScaleByPressDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-   QInflowScaleByPressDevice27<<< gridQ, threads >>> (  rhoBC,
-														DD,
-														k_Q,
-														k_N,
-														numberOfBCnodes,
-														om1,
-														neighborX,
-														neighborY,
-														neighborZ,
-														size_Mat,
-														isEvenTimestep);
+   QInflowScaleByPressDevice27<<< grid, threads >>> (
+           boundaryCondition->RhoBC,
+           parameterDevice->distributions.f[0],
+           boundaryCondition->k,
+           boundaryCondition->kN,
+           boundaryCondition->numberOfBCnodes,
+           parameterDevice->omega,
+           parameterDevice->neighborX,
+           parameterDevice->neighborY,
+           parameterDevice->neighborZ,
+           parameterDevice->numberOfNodes,
+           parameterDevice->isEvenTimestep);
    getLastCudaError("QInflowScaleByPressDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -3966,131 +3900,64 @@ extern "C" void QPressDevOld27(  unsigned int numberOfThreads,
       getLastCudaError("QPressDeviceOld27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QPressDevIncompNEQ27(unsigned int numberOfThreads,
-                                     real* rhoBC,
-                                     real* DD,
-                                     int* k_Q,
-                                     int* k_N,
-                                     unsigned int numberOfBCnodes,
-                                     real om1,
-                                     unsigned int* neighborX,
-                                     unsigned int* neighborY,
-                                     unsigned int* neighborZ,
-                                     unsigned int size_Mat,
-                                     bool isEvenTimestep)
+extern "C" void QPressDevIncompNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QPressDeviceIncompNEQ27<<< gridQ, threads >>> (   rhoBC,
-														DD,
-														k_Q,
-														k_N,
-														numberOfBCnodes,
-														om1,
-														neighborX,
-														neighborY,
-														neighborZ,
-														size_Mat,
-														isEvenTimestep);
-      getLastCudaError("QPressDeviceIncompNEQ27 execution failed");
+   QPressDeviceIncompNEQ27<<< grid, threads >>> (
+         boundaryCondition->RhoBC,
+         parameterDevice->distributions.f[0],
+         boundaryCondition->k,
+         boundaryCondition->kN,
+         boundaryCondition->numberOfBCnodes,
+         parameterDevice->omega,
+         parameterDevice->neighborX,
+         parameterDevice->neighborY,
+         parameterDevice->neighborZ,
+         parameterDevice->numberOfNodes,
+         parameterDevice->isEvenTimestep);
+   getLastCudaError("QPressDeviceIncompNEQ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QPressDevNEQ27(  unsigned int numberOfThreads,
-                                     real* rhoBC,
-                                     real* distribution,
-                                     int* bcNodeIndices,
-                                     int* bcNeighborIndices,
-                                     unsigned int numberOfBCnodes,
-                                     real omega1,
-                                     unsigned int* neighborX,
-                                     unsigned int* neighborY,
-                                     unsigned int* neighborZ,
-                                     unsigned int size_Mat,
-                                     bool isEvenTimestep)
+extern "C" void QPressDevNEQ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QPressDeviceNEQ27<<< gridQ, threads >>> ( rhoBC,
-                                                distribution,
-                                                bcNodeIndices,
-                                                bcNeighborIndices,
-                                                numberOfBCnodes,
-                                                omega1,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                size_Mat,
-                                                isEvenTimestep);
-      getLastCudaError("QPressDeviceOld27 execution failed");
+   QPressDeviceNEQ27<<< grid, threads >>> (
+        boundaryCondition->RhoBC,
+        parameterDevice->distributions.f[0],
+        boundaryCondition->k,
+        boundaryCondition->kN,
+        boundaryCondition->numberOfBCnodes,
+        parameterDevice->omega,
+        parameterDevice->neighborX,
+        parameterDevice->neighborY,
+        parameterDevice->neighborZ,
+        parameterDevice->numberOfNodes,
+        parameterDevice->isEvenTimestep);
+   getLastCudaError("QPressDevNEQ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
-extern "C" void QPressDevEQZ27(  unsigned int numberOfThreads,
-                                     real* rhoBC,
-                                     real* DD,
-                                     int* k_Q,
-                                     int* k_N,
-                                     real* kTestRE,
-                                     unsigned int numberOfBCnodes,
-                                     real om1,
-                                     unsigned int* neighborX,
-                                     unsigned int* neighborY,
-                                     unsigned int* neighborZ,
-                                     unsigned int size_Mat,
-                                     bool isEvenTimestep)
+extern "C" void QPressDevEQZ27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition)
 {
-   int Grid = (numberOfBCnodes / numberOfThreads)+1;
-   int Grid1, Grid2;
-   if (Grid>512)
-   {
-      Grid1 = 512;
-      Grid2 = (Grid/Grid1)+1;
-   }
-   else
-   {
-      Grid1 = 1;
-      Grid2 = Grid;
-   }
-   dim3 gridQ(Grid1, Grid2);
-   dim3 threads(numberOfThreads, 1, 1 );
+   dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
+   dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      QPressDeviceEQZ27<<< gridQ, threads >>> ( rhoBC,
-                                                DD,
-                                                k_Q,
-                                                k_N,
-                                                kTestRE,
-                                                numberOfBCnodes,
-                                                om1,
-                                                neighborX,
-                                                neighborY,
-                                                neighborZ,
-                                                size_Mat,
-                                                isEvenTimestep);
+      QPressDeviceEQZ27<<< grid, threads >>> (
+            boundaryCondition->RhoBC,
+            parameterDevice->distributions.f[0],
+            boundaryCondition->k,
+            boundaryCondition->kN,
+            parameterDevice->kDistTestRE.f[0],
+            boundaryCondition->numberOfBCnodes,
+            parameterDevice->omega,
+            parameterDevice->neighborX,
+            parameterDevice->neighborY,
+            parameterDevice->neighborZ,
+            parameterDevice->numberOfNodes,
+            parameterDevice->isEvenTimestep);
       getLastCudaError("QPressDeviceEQZ27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
@@ -4177,17 +4044,17 @@ extern "C" void BBDev27(LBMSimulationParameter* parameterDevice, QforBoundaryCon
    dim3 grid = vf::cuda::getCudaGrid( parameterDevice->numberofthreads,  boundaryCondition->numberOfBCnodes);
    dim3 threads(parameterDevice->numberofthreads, 1, 1 );
 
-      BBDevice27<<< grid, threads >>> (
-            parameterDevice->distributions.f[0],
-            boundaryCondition->k,
-            boundaryCondition->q27[0],
-            boundaryCondition->numberOfBCnodes,
-            parameterDevice->neighborX,
-            parameterDevice->neighborY,
-            parameterDevice->neighborZ,
-            parameterDevice->numberOfNodes,
-            parameterDevice->isEvenTimestep);
-      getLastCudaError("BBDevice27 execution failed");
+   BBDevice27<<< grid, threads >>> (
+         parameterDevice->distributions.f[0],
+         boundaryCondition->k,
+         boundaryCondition->q27[0],
+         boundaryCondition->numberOfBCnodes,
+         parameterDevice->neighborX,
+         parameterDevice->neighborY,
+         parameterDevice->neighborZ,
+         parameterDevice->numberOfNodes,
+         parameterDevice->isEvenTimestep);
+   getLastCudaError("BBDevice27 execution failed");
 }
 //////////////////////////////////////////////////////////////////////////
 extern "C" void QPressDev27_IntBB(  unsigned int numberOfThreads,
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp
index 0ca174fac..f3b6d072e 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp
@@ -45,6 +45,7 @@ LBKernelManager::LBKernelManager(SPtr<Parameter> parameter, BoundaryConditionFac
     this->velocityBoundaryConditionPost = bcFactory->getVelocityBoundaryConditionPost();
     this->noSlipBoundaryConditionPost   = bcFactory->getNoSlipBoundaryConditionPost();
     this->slipBoundaryConditionPost     = bcFactory->getSlipBoundaryConditionPost();
+    this->pressureBoundaryConditionPre  = bcFactory->getPressureBoundaryConditionPre();
 }
 
 void LBKernelManager::runLBMKernel(const int level) const
@@ -449,19 +450,7 @@ void LBKernelManager::runGeoBCKernelPost(const int level) const
 void LBKernelManager::runOutflowBCKernelPre(const int level) const{
     if (para->getParD(level)->outflowBC.numberOfBCnodes > 0)
     {
-        QPressNoRhoDev27(
-            para->getParD(level)->numberofthreads,
-            para->getParD(level)->outflowBC.RhoBC,
-            para->getParD(level)->distributions.f[0],
-            para->getParD(level)->outflowBC.k,
-            para->getParD(level)->outflowBC.kN,
-            para->getParD(level)->outflowBC.numberOfBCnodes,
-            para->getParD(level)->omega,
-            para->getParD(level)->neighborX,
-            para->getParD(level)->neighborY,
-            para->getParD(level)->neighborZ,
-            para->getParD(level)->numberOfNodes,
-            para->getParD(level)->isEvenTimestep);
+        QPressNoRhoDev27(para->getParD(level).get(), &(para->getParD(level)->outflowBC));
 
         // TODO: https://git.rz.tu-bs.de/irmb/VirtualFluids_dev/-/issues/29
         // if (  myid == numprocs - 1)
@@ -488,80 +477,7 @@ void LBKernelManager::runOutflowBCKernelPre(const int level) const{
 void LBKernelManager::runPressureBCKernelPre(const int level) const{
     if (para->getParD(level)->pressureBC.numberOfBCnodes > 0)
     {
-        QPressNoRhoDev27(
-            para->getParD(level)->numberofthreads,
-            para->getParD(level)->pressureBC.RhoBC,
-            para->getParD(level)->distributions.f[0],
-            para->getParD(level)->pressureBC.k,
-            para->getParD(level)->pressureBC.kN,
-            para->getParD(level)->pressureBC.numberOfBCnodes,
-            para->getParD(level)->omega,
-            para->getParD(level)->neighborX,
-            para->getParD(level)->neighborY,
-            para->getParD(level)->neighborZ,
-            para->getParD(level)->numberOfNodes,
-            para->getParD(level)->isEvenTimestep);
-
-        // QPressDevEQZ27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->pressureBC.RhoBC,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->pressureBC.k,
-        //     para->getParD(level)->pressureBC.kN,
-        //     para->getParD(level)->kDistTestRE.f[0],
-        //     para->getParD(level)->pressureBC.numberOfBCnodes,
-        //     para->getParD(level)->omega,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(0)->neighborZ,
-        //     para->getParD(level)->numberOfNodes,
-        //     para->getParD(level)->isEvenTimestep);
-
-        // QInflowScaleByPressDev27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->pressureBC.RhoBC,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->pressureBC.k,
-        //     para->getParD(level)->pressureBC.kN,
-        //     para->getParD(level)->pressureBC.numberOfBCnodes,
-        //     para->getParD(0)->omega,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(0)->neighborZ,
-        //     para->getParD(level)->numberOfNodes,
-        //     para->getParD(level)->isEvenTimestep);
-
-        // //////////////////////////////////////////////////////////////////////////////
-        // // press NEQ incompressible
-        // QPressDevIncompNEQ27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->pressureBC.RhoBC,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->pressureBC.k,
-        //     para->getParD(level)->pressureBC.kN,
-        //     para->getParD(level)->pressureBC.numberOfBCnodes,
-        //     para->getParD(level)->omega,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->numberOfNodes,
-        //     para->getParD(level)->isEvenTimestep);
-
-        // ////////////////////////////////////////////////////////////////////////////////
-        // // press NEQ compressible
-        // QPressDevNEQ27(
-        //     para->getParD(level)->numberofthreads,
-        //     para->getParD(level)->pressureBC.RhoBC,
-        //     para->getParD(level)->distributions.f[0],
-        //     para->getParD(level)->pressureBC.k,
-        //     para->getParD(level)->pressureBC.kN,
-        //     para->getParD(level)->pressureBC.numberOfBCnodes,
-        //     para->getParD(level)->omega,
-        //     para->getParD(level)->neighborX,
-        //     para->getParD(level)->neighborY,
-        //     para->getParD(level)->neighborZ,
-        //     para->getParD(level)->numberOfNodes,
-        //     para->getParD(level)->isEvenTimestep);
+        this->pressureBoundaryConditionPre(para->getParD(level).get(), &(para->getParD(level)->pressureBC));
     }
 }
 
@@ -666,4 +582,4 @@ void LBKernelManager::runNoSlipBCKernelPost(const int level) const{
 //                para->getParD()->distributions.f[0],
 //                para->getParD()->isEvenTimestep);
 //      }
-// }#
+// }
diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h
index cb32e8dc6..e8b8a2cc0 100644
--- a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h
+++ b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h
@@ -100,5 +100,6 @@ private:
     boundaryCondition velocityBoundaryConditionPost;
     boundaryCondition noSlipBoundaryConditionPost;
     boundaryCondition slipBoundaryConditionPost;
+    boundaryCondition pressureBoundaryConditionPre;
 };
 #endif
-- 
GitLab