diff --git a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp index 57349a82072dbf8e64c17a1f678224a9a6e177cb..2cde1330ba9832dc9ee7a68542b25541d104a2cc 100644 --- a/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp +++ b/apps/gpu/LBM/DrivenCavity/DrivenCavity.cpp @@ -210,6 +210,7 @@ void multipleLevel(const std::string& configPath) gridBuilder->setNoSlipBoundaryCondition(SideType::MY); gridBuilder->setVelocityBoundaryCondition(SideType::PZ, vx, vx, 0.0); gridBuilder->setNoSlipBoundaryCondition(SideType::MZ); + bcFactory.setNoSlipBoundaryCondition(BoundaryConditionFactory::NoSlipBC::NoSlipIncompressible); bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocitySimpleBounceBackCompressible); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp index 6bc2326e1929f4a2deaa48a1c7400f4a0f6d1639..881824928e08847a76c3b563e4154d67dd5c8dc6 100644 --- a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp +++ b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.cpp @@ -7,9 +7,14 @@ void BoundaryConditionFactory::setVelocityBoundaryCondition(VelocityBC boundaryC this->velocityBoundaryCondition = boundaryConditionType; } +void BoundaryConditionFactory::setNoSlipBoundaryCondition(const NoSlipBC boundaryConditionType) +{ + this->noSlipBoundaryCondition = boundaryConditionType; +} + boundaryCondition BoundaryConditionFactory::getVelocityBoundaryConditionPost() const { - // for descriptions of the boundary conditions refer to the header ( VelocityBC) + // for descriptions of the boundary conditions refer to the header switch (this->velocityBoundaryCondition) { case VelocityBC::VelocitySimpleBounceBackCompressible: return QVelDevicePlainBB27; @@ -17,7 +22,7 @@ boundaryCondition BoundaryConditionFactory::getVelocityBoundaryConditionPost() c case VelocityBC::VelocityIncompressible: return QVelDev27; break; - case VelocityBC::VelocityCompressible: + case VelocityBC::VelocityCompressible: return QVelDevComp27; break; case VelocityBC::VelocityAndPressureCompressible: @@ -26,4 +31,26 @@ boundaryCondition BoundaryConditionFactory::getVelocityBoundaryConditionPost() c default: return nullptr; } -} \ No newline at end of file +} + +boundaryCondition BoundaryConditionFactory::getNoSlipBoundaryConditionPost() const +{ + // for descriptions of the boundary conditions refer to the header + switch (this->noSlipBoundaryCondition) { + case NoSlipBC::NoSlipBounceBack: + return BBDev27; + break; + case NoSlipBC::NoSlipIncompressible: + return QDev27; + break; + case NoSlipBC::NoSlipCompressible: + return QDevComp27; + 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 099423fcf08bd028fb667e4f584adaef2b4c071a..10544d996f425fb572e41b491c9c31e7bbe40c22 100644 --- a/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h +++ b/src/gpu/VirtualFluids_GPU/BoundaryConditions/BoundaryConditionFactory.h @@ -27,18 +27,32 @@ public: VelocityAndPressureCompressible }; + //! \brief An enumeration for selecting a no-slip boundary condition + enum class NoSlipBC { + //! - NoSlipBounceBack = bounce back no-slip boundary condition + NoSlipBounceBack, + //! - NoSlipIncompressible = interpolated no-slip boundary condition, based on subgrid distances + NoSlipIncompressible, + //! - NoSlipCompressible = interpolated no-slip boundary condition, based on subgrid distances + NoSlipCompressible + }; + // 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 setGeometryBoundaryCondition(const std::variant<VelocityBC, NoSlipBC, SlipBC> boundaryConditionType); // void setOutflowBoundaryCondition(...); // TODO: // https://git.rz.tu-bs.de/m.schoenherr/VirtualFluids_dev/-/issues/16 boundaryCondition getVelocityBoundaryConditionPost() const; + boundaryCondition getNoSlipBoundaryConditionPost() const; private: VelocityBC velocityBoundaryCondition; + NoSlipBC noSlipBoundaryCondition; // 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 3f517369c8d1304579500453396b131d91b12e00..997948913654c2e373bc692f25d8be68023e3e6c 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h +++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h @@ -646,31 +646,9 @@ extern "C" void BcVel27(int nx, real u0x, real om); -extern "C" void QDev27( unsigned int numberOfThreads, - int nx, - int ny, - 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 QDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition); -extern "C" void QDevComp27(unsigned int numberOfThreads, - real* distribution, - int* subgridDistanceIndices, - real* subgridDistances, - unsigned int numberOfBCnodes, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep); +extern "C" void QDevComp27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition); extern "C" void QDevCompThinWalls27(unsigned int numberOfThreads, real* DD, @@ -1119,19 +1097,7 @@ extern "C" void QPressDevFake27( unsigned int numberOfThreads, unsigned int size_Mat, bool isEvenTimestep); -extern "C" void BBDev27( unsigned int numberOfThreads, - int nx, - int ny, - 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 BBDev27(LBMSimulationParameter* parameterDevice, QforBoundaryConditions* boundaryCondition); extern "C" void QPressDev27_IntBB( unsigned int numberOfThreads, real* rho, diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu index 74e091bbe2598e5a9fb8f70d4be159947d10fc5f..b557078bb89366f6f6c3cc77d12f083cbd55360d 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu @@ -2650,88 +2650,44 @@ extern "C" void QADPressIncompDev27( unsigned int numberOfThreads, getLastCudaError("QADPressIncomp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// -extern "C" void QDev27( unsigned int numberOfThreads, - int nx, - int ny, - 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 QDev27(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 ); + + QDevice27<<< grid, threads >>> ( + parameterDevice->nx, + parameterDevice->ny, + parameterDevice->distributions.f[0], + boundaryCondition->k, + boundaryCondition->q27[0], + boundaryCondition->numberOfBCnodes, + parameterDevice->omega, + parameterDevice->neighborX, + parameterDevice->neighborY, + parameterDevice->neighborZ, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); - QDevice27<<< gridQ, threads >>> (nx, - ny, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); getLastCudaError("QDevice27 execution failed"); } ////////////////////////////////////////////////////////////////////////// -extern "C" void QDevComp27( unsigned int numberOfThreads, - real* distribution, - int* subgridDistanceIndices, - real* subgridDistances, - unsigned int numberOfBCnodes, - real omega, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - unsigned int numberOfLBnodes, - bool isEvenTimestep) +extern "C" void QDevComp27(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 ); - QDeviceComp27<<< gridQ, threads >>> ( - distribution, - subgridDistanceIndices, - subgridDistances, - numberOfBCnodes, - omega, - neighborX, - neighborY, - neighborZ, - numberOfLBnodes, - isEvenTimestep); + QDeviceComp27<<< grid, threads >>> ( + parameterDevice->distributions.f[0], + boundaryCondition->k, + boundaryCondition->q27[0], + boundaryCondition->numberOfBCnodes, + parameterDevice->omega, + parameterDevice->neighborX, + parameterDevice->neighborY, + parameterDevice->neighborZ, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); getLastCudaError("QDeviceComp27 execution failed"); } ////////////////////////////////////////////////////////////////////////// @@ -4260,47 +4216,22 @@ extern "C" void QPressDevFake27( unsigned int numberOfThreads, getLastCudaError("QPressDeviceFake27 execution failed"); } ////////////////////////////////////////////////////////////////////////// -extern "C" void BBDev27( unsigned int numberOfThreads, - int nx, - int ny, - 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 BBDev27(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 ); - BBDevice27<<< gridQ, threads >>> ( nx, - ny, - DD, - k_Q, - QQ, - numberOfBCnodes, - om1, - neighborX, - neighborY, - neighborZ, - size_Mat, - isEvenTimestep); + BBDevice27<<< grid, threads >>> ( + parameterDevice->distributions.f[0], + boundaryCondition->k, + boundaryCondition->q27[0], + boundaryCondition->numberOfBCnodes, + parameterDevice->omega, + parameterDevice->neighborX, + parameterDevice->neighborY, + parameterDevice->neighborZ, + parameterDevice->numberOfNodes, + parameterDevice->isEvenTimestep); getLastCudaError("BBDevice27 execution failed"); } ////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp index 375e19c7113e13a8b71c473b3753354508ec4725..d6a53ba59cd0222293eccbd64a94d75c89481a85 100644 --- a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp +++ b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.cpp @@ -43,6 +43,7 @@ LBKernelManager::LBKernelManager(SPtr<Parameter> parameter, BoundaryConditionFactory* bcFactory): para(parameter) { this->velocityBoundaryConditionPost = bcFactory->getVelocityBoundaryConditionPost(); + this->noSlipBoundaryConditionPost = bcFactory->getNoSlipBoundaryConditionPost(); } void LBKernelManager::runLBMKernel(const int level) const @@ -135,8 +136,6 @@ void LBKernelManager::runVelocityBCKernelPost(const int level) const { velocityBoundaryConditionPost(para->getParD(level).get(), &(para->getParD(level)->velocityBC)); - //QVelDevicePlainBB27(para->getParD(level).get(), &(para->getParD(level)->velocityBC)); - ////////////////////////////////////////////////////////////////////////// // D E P R E C A T E D ////////////////////////////////////////////////////////////////////////// @@ -653,48 +652,7 @@ void LBKernelManager::runSlipBCKernel(const int level) const{ void LBKernelManager::runNoSlipBCKernel(const int level) const{ if (para->getParD(level)->noSlipBC.numberOfBCnodes > 0) { - // QDev27( - // para->getParD(level)->numberofthreads, - // para->getParD(level)->nx, - // para->getParD(level)->ny, - // para->getParD(level)->distributions.f[0], - // para->getParD(level)->noSlipBC.k, - // para->getParD(level)->noSlipBC.q27[0], - // para->getParD(level)->noSlipBC.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); - - // BBDev27( - // para->getParD(level)->numberofthreads, - // para->getParD(level)->nx, - // para->getParD(level)->ny, - // para->getParD(level)->distributions.f[0], - // para->getParD(level)->noSlipBC.k, - // para->getParD(level)->noSlipBC.q27[0], - // para->getParD(level)->noSlipBC.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); - - QDevComp27( - para->getParD(level)->numberofthreads, - para->getParD(level)->distributions.f[0], - para->getParD(level)->noSlipBC.k, - para->getParD(level)->noSlipBC.q27[0], - para->getParD(level)->noSlipBC.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); + noSlipBoundaryConditionPost(para->getParD(level).get(), &(para->getParD(level)->noSlipBC)); } } diff --git a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h index b98469907e52241bed21758cbddaa126d97a2ebc..08a657d2dc3a0713e18ff4942dbdcab7a11490fb 100644 --- a/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h +++ b/src/gpu/VirtualFluids_GPU/KernelManager/LBKernelManager.h @@ -98,5 +98,6 @@ private: SPtr<Parameter> para; boundaryCondition velocityBoundaryConditionPost; + boundaryCondition noSlipBoundaryConditionPost; }; #endif