diff --git a/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/AdvectionDiffusion.cpp b/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/ADKernelManager.cpp similarity index 92% rename from src/gpu/VirtualFluids_GPU/AdvectionDiffusion/AdvectionDiffusion.cpp rename to src/gpu/VirtualFluids_GPU/AdvectionDiffusion/ADKernelManager.cpp index 27278684a1875c41b855076d4ee702d721d9a9fe..7f7697f70d1e216575a9a84f424507d6a461c489 100644 --- a/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/AdvectionDiffusion.cpp +++ b/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/ADKernelManager.cpp @@ -30,13 +30,13 @@ //! \ingroup AdvectionDiffusion //! \author Martin Schoenherr //======================================================================================= -#include "AdvectionDiffusion/AdvectionDiffusion.h" +#include "AdvectionDiffusion/ADKernelManager.h" #include "GPU/CudaMemoryManager.h" #include "GPU/GPU_Interface.h" #include "Parameter/Parameter.h" //////////////////////////////////////////////////////////////////////////////// -void initAD(SPtr<Parameter> para) +void ADKernelManager::initAD() { ////////////////////////////////////////////////////////////////////////// // calculation of omega for diffusivity @@ -87,7 +87,7 @@ void initAD(SPtr<Parameter> para) } //////////////////////////////////////////////////////////////////////////////// -void setInitialNodeValuesAD(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager) +void ADKernelManager::setInitialNodeValuesAD(SPtr<CudaMemoryManager> cudaMemoryManager) { for (uint j = 1; j <= para->getParH()->numberOfNodes; j++) { const real coordX = para->getParH()->coordinateX[j]; @@ -110,7 +110,7 @@ void setInitialNodeValuesAD(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMe } //////////////////////////////////////////////////////////////////////////////// -void runADcollisionKernel(SPtr<Parameter> para) +void ADKernelManager::runADcollisionKernel() { FactorizedCentralMomentsAdvectionDiffusionDeviceKernel( para->getParD()->numberofthreads, @@ -126,7 +126,7 @@ void runADcollisionKernel(SPtr<Parameter> para) para->getParD()->isEvenTimestep); } -void runADslipBCKernel(){ +void ADKernelManager::runADslipBCKernel(){ if (para->getParD()->numberOfSlipBCnodes > 1) { ADSlipVelDevComp( para->getParD()->numberofthreads, @@ -149,7 +149,7 @@ void runADslipBCKernel(){ //////////////////////////////////////////////////////////////////////////////// -void printAD(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager) +void ADKernelManager::printAD(SPtr<CudaMemoryManager> cudaMemoryManager) { CalcConcentration27( para->getParD()->numberofthreads, @@ -164,3 +164,14 @@ void printAD(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager) cudaMemoryManager->cudaCopyConcentrationDeviceToHost(); } + +SPtr<ADKernelManager> ADKernelManager::make(SPtr<Parameter> parameter){ + return SPtr<ADKernelManager>(new ADKernelManager(parameter)); +} + +ADKernelManager::ADKernelManager(SPtr<Parameter> parameter): para(parameter){} + +ADKernelManager::ADKernelManager(const ADKernelManager&) +{ + +} \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/AdvectionDiffusion.h b/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/ADKernelManager.h similarity index 75% rename from src/gpu/VirtualFluids_GPU/AdvectionDiffusion/AdvectionDiffusion.h rename to src/gpu/VirtualFluids_GPU/AdvectionDiffusion/ADKernelManager.h index 659b0a9b29fc157e47de8870fd37536718a1839e..04e234be04dfc33dfee22ccda5f155f658cad87b 100644 --- a/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/AdvectionDiffusion.h +++ b/src/gpu/VirtualFluids_GPU/AdvectionDiffusion/ADKernelManager.h @@ -40,22 +40,48 @@ class Parameter; class CudaMemoryManager; +//! \class ADKernelManager +//! \brief manage the advection diffusion kernel calls +class ADKernelManager{ + +public: + +//! \brief makes an object of ADKernelManager +//! \param para shared pointer to instance of class Parameter +static SPtr<ADKernelManager> make(SPtr<Parameter> parameter); + //! \brief initialize the Advection Diffusion distributions //! \param para instance of class Parameter -void initAD(SPtr<Parameter> para); +void initAD(); //! \brief set initial concentration values at all nodes //! \param para instance of class Parameter //! \param cudaManager instance of class CudaMemoryManager -void setInitialNodeValuesAD(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager); +void setInitialNodeValuesAD(SPtr<CudaMemoryManager> cudaMemoryManager); //! \brief calculate the state of the next time step of the Advection Diffusion distributions //! \param para instance of class Parameter -void calcAD(SPtr<Parameter> para); +void runADcollisionKernel(); + +//! \brief calls the device function of the slip boundary condition for advection diffusion +void runADslipBCKernel(); //! \brief copy the concentration from device to host and writes VTK file with concentration //! \param para instance of class Parameter //! \param cudaManager instance of class CudaMemoryManager -void printAD(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager); +void printAD(SPtr<CudaMemoryManager> cudaMemoryManager); + + +private: + //! Class constructor + //! \param parameter shared pointer to instance of class Parameter + ADKernelManager(SPtr<Parameter> parameter); + //! Class copy constructor + //! \param ADKernelManager is a reference to ADKernelManager object + ADKernelManager(const ADKernelManager&); + + //! \property para is a shared pointer to an object of Parameter + SPtr<Parameter> para; +}; #endif diff --git a/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp b/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp index 7475eece94255451208d2ad5dbca5397e5815f12..e7e9e48dba8ad7485a2ef4c90cdde5cd813d2923 100644 --- a/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp +++ b/src/gpu/VirtualFluids_GPU/Init/InitLattice.cpp @@ -33,10 +33,10 @@ #include "Init/InitLattice.h" #include "Parameter/Parameter.h" #include "GPU/GPU_Interface.h" -#include "AdvectionDiffusion/AdvectionDiffusion.h" +#include "AdvectionDiffusion/ADKernelManager.h" //////////////////////////////////////////////////////////////////////////////// -void initLattice(SPtr<Parameter> para) +void initLattice(SPtr<Parameter> para, ADKernelManager* adKernelManager) { ////////////////////////////////////////////////////////////////////////// para->getParD()->isEvenTimestep = true; @@ -89,6 +89,5 @@ void initLattice(SPtr<Parameter> para) ////////////////////////////////////////////////////////////////////////// if (para->getIsADcalculationOn()) - initAD(para); - + adKernelManager->initAD(); } diff --git a/src/gpu/VirtualFluids_GPU/Init/InitLattice.h b/src/gpu/VirtualFluids_GPU/Init/InitLattice.h index 4c51d2ee0a4f500aaa3dd4d49217fe603059e9d5..c7b1912315109dd9f3c3b652d3fdab27e0d5b614 100644 --- a/src/gpu/VirtualFluids_GPU/Init/InitLattice.h +++ b/src/gpu/VirtualFluids_GPU/Init/InitLattice.h @@ -37,9 +37,10 @@ //! \brief Class forwarding for Parameter class Parameter; +class ADKernelManager; //! \brief initialize the LBM lattice //! \param para instance of classParameter -void initLattice(SPtr<Parameter> para); +void initLattice(SPtr<Parameter> para, ADKernelManager* adKernelManager); #endif diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp index 95d3f15dff5d3a31240c965a36d243096ba1a2ef..55cd078ab34d21d8a8e61f4ea102166e3ed77a64 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp @@ -31,9 +31,9 @@ //! \author Martin Schoenherr //======================================================================================= #include "Simulation.h" -#include "AdvectionDiffusion/AdvectionDiffusion.h" #include "DataStructureInitializer/GridProvider.h" #include "GPU/CudaKernelManager.h" +#include "AdvectionDiffusion/ADKernelManager.h" #include "GPU/CudaMemoryManager.h" #include "GPU/devCheck.h" #include "Init/InitLattice.h" @@ -50,7 +50,9 @@ #include <stdio.h> ////////////////////////////////////////////////////////////////////////// -Simulation::Simulation() {} +Simulation::Simulation() { + this->adKernelManager = ADKernelManager::make(para); +} Simulation::~Simulation() {} @@ -100,19 +102,19 @@ void Simulation::init(SPtr<Parameter> para, SPtr<GridProvider> gridProvider, SPt para->getParD()->diffusivity = para->getParH()->diffusivity; cudaMemoryManager->cudaAllocConcentrationDistributions(); cudaMemoryManager->cudaAllocConcentration(); - setInitialNodeValuesAD(para, cudaMemoryManager); + adKernelManager->setInitialNodeValuesAD(cudaMemoryManager); } ////////////////////////////////////////////////////////////////////////// // initialize the grid output << "init lattice..."; - initLattice(para); + initLattice(para, adKernelManager.get()); output << "done.\n"; ////////////////////////////////////////////////////////////////////////// // print initialized grid output << "Print files Init..."; - dataWriter->writeInit(para, cudaMemoryManager, cudaKernelManager); + dataWriter->writeInit(para, cudaMemoryManager, cudaKernelManager, adKernelManager.get()); output << "done.\n"; ////////////////////////////////////////////////////////////////////////// @@ -135,8 +137,10 @@ void Simulation::run() for (timestep = para->getTimestepStart(); timestep <= para->getTimestepEnd(); timestep++) { //////////////////////////////////////////////////////////////////////////////// // Advection Diffusion calculation ... Advection first -> fluid second - if (para->getIsADcalculationOn()) - calcAD(para); + if (para->getIsADcalculationOn()){ + adKernelManager->runADcollisionKernel(); + adKernelManager->runADslipBCKernel(); + } //////////////////////////////////////////////////////////////////////////////// // LBM Kernel @@ -169,7 +173,7 @@ void Simulation::run() // IO if (para->getPrintFiles()) { output << "File IO for t=" << timestep << "..."; - dataWriter->writeTimestep(para, cudaMemoryManager, cudaKernelManager, timestep); + dataWriter->writeTimestep(para, cudaMemoryManager, cudaKernelManager, adKernelManager.get(), timestep); output << "done.\n"; } timer->start(); diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h index 569a4b63e4c263eceb3c302d6c022aa930292c6f..764bdab9c0e8dcdad6979f325b4607ddd9ec29f5 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.h +++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.h @@ -40,6 +40,7 @@ //! \brief Class forwarding for CudaMemoryManager, Parameter, GridProvider and DataWriter class CudaMemoryManager; class CudaKernelManager; +class ADKernelManager; class Parameter; class GridProvider; class DataWriter; @@ -76,5 +77,7 @@ protected: SPtr<CudaMemoryManager> cudaMemoryManager; //! \property cudaKernelManager is a shared pointer to an object of CudaKernelManager SPtr<CudaKernelManager> cudaKernelManager; + //! \property adKernelManager is a shared pointer to an object of ADKernelManager + std::shared_ptr<ADKernelManager> adKernelManager; }; #endif diff --git a/src/gpu/VirtualFluids_GPU/Output/DataWriter.h b/src/gpu/VirtualFluids_GPU/Output/DataWriter.h index a476195095d525c2970a17c76193882b3ceb5e24..39d009c3dfbe2f0edd04721d9292eb1a315c338e 100644 --- a/src/gpu/VirtualFluids_GPU/Output/DataWriter.h +++ b/src/gpu/VirtualFluids_GPU/Output/DataWriter.h @@ -41,6 +41,7 @@ class Parameter; class CudaMemoryManager; class CudaKernelManager; +class ADKernelManager; //! \class FileWriter //! \brief manages the VTK output @@ -59,7 +60,8 @@ public: virtual void VIRTUALFLUIDS_GPU_EXPORT writeInit( SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager, - SPtr<CudaKernelManager> cudaKernelManager) = 0; + SPtr<CudaKernelManager> cudaKernelManager, + ADKernelManager* ADKernelManager) = 0; //! \brief write time step to VTK file(s) //! \param para instance of classParameter //! \param cudaMemoryManager instance of class CudaMemoryManager @@ -68,7 +70,8 @@ public: virtual void VIRTUALFLUIDS_GPU_EXPORT writeTimestep( SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager, - SPtr<CudaKernelManager> cudaKernelManager, + SPtr<CudaKernelManager> cudaKernelManager, + ADKernelManager* ADKernelManager, uint timestep) = 0; }; #endif diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp index 8f77ce0ef5388303d621e09696ac83b71a0f7cce..8c8afafc86c26d1eace9cba887490c4b98493803 100644 --- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp +++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.cpp @@ -34,19 +34,19 @@ #include "GPU/CudaMemoryManager.h" #include "Parameter/Parameter.h" #include "basics/writer/WbWriterVtkXmlBinary.h" -#include "AdvectionDiffusion/AdvectionDiffusion.h" +#include "AdvectionDiffusion/ADKernelManager.h" #include "GPU/CudaKernelManager.h" -void FileWriter::writeInit(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager, SPtr<CudaKernelManager> cudaKernelManager) +void FileWriter::writeInit(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager, SPtr<CudaKernelManager> cudaKernelManager, ADKernelManager* adKernelManager) { uint timestep = 0; - writeTimestep(para, cudaMemoryManager, cudaKernelManager, timestep); + writeTimestep(para, cudaMemoryManager, cudaKernelManager, adKernelManager, timestep); } -void FileWriter::writeTimestep(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager, SPtr<CudaKernelManager> cudaKernelManager, uint timestep) +void FileWriter::writeTimestep(SPtr<Parameter> para, SPtr<CudaMemoryManager> cudaMemoryManager, SPtr<CudaKernelManager> cudaKernelManager, ADKernelManager* adKernelManager, uint timestep) { if (para->getIsADcalculationOn()) - printAD(para, cudaMemoryManager); + adKernelManager->printAD(cudaMemoryManager); cudaKernelManager->calculateMacroscopicValues(para); cudaMemoryManager->cudaCopyDataToHost(); diff --git a/src/gpu/VirtualFluids_GPU/Output/FileWriter.h b/src/gpu/VirtualFluids_GPU/Output/FileWriter.h index e1dc92e39f19d84b014a20de8d1bc9577cc8c81a..836e875a7bf5452db63d541dc666691b08081f0a 100644 --- a/src/gpu/VirtualFluids_GPU/Output/FileWriter.h +++ b/src/gpu/VirtualFluids_GPU/Output/FileWriter.h @@ -42,48 +42,51 @@ class Parameter; class CudaMemoryManager; class CudaKernelManager; +class ADKernelManager; //! \class FileWriter derived class of DataWriter //! \brief manages the VTK output class FileWriter : public DataWriter { public: - //! Class default constructor - VIRTUALFLUIDS_GPU_EXPORT FileWriter() {} - //! Class destructor - VIRTUALFLUIDS_GPU_EXPORT ~FileWriter() {} + //! Class default constructor + VIRTUALFLUIDS_GPU_EXPORT FileWriter() {} + //! Class destructor + VIRTUALFLUIDS_GPU_EXPORT ~FileWriter() {} - //! \brief write the initialization step to VTK file(s) - //! \param para instance of classParameter - //! \param cudaMemoryManager instance of class CudaMemoryManager + //! \brief write the initialization step to VTK file(s) + //! \param para instance of classParameter + //! \param cudaMemoryManager instance of class CudaMemoryManager //! \param cudaKernelManager instance of class CudaKernelManager void VIRTUALFLUIDS_GPU_EXPORT writeInit( - SPtr<Parameter> para, - SPtr<CudaMemoryManager> cudaMemoryManager, - SPtr<CudaKernelManager> cudaKernelManager) override; - //! \brief write time step to VTK file(s) - //! \param para instance of classParameter + SPtr<Parameter> para, + SPtr<CudaMemoryManager> cudaMemoryManager, + SPtr<CudaKernelManager> cudaKernelManager, + ADKernelManager* adKernelManager) override; + //! \brief write time step to VTK file(s) + //! \param para instance of classParameter //! \param cudaMemoryManager instance of class CudaMemoryManager //! \param cudaKernelManager instance of class CudaKernelManager //! \param timestep of the simulation - void VIRTUALFLUIDS_GPU_EXPORT writeTimestep( - SPtr<Parameter> para, - SPtr<CudaMemoryManager> cudaMemoryManager, - SPtr<CudaKernelManager> cudaKernelManager, - uint timestep) override; + void VIRTUALFLUIDS_GPU_EXPORT writeTimestep( + SPtr<Parameter> para, + SPtr<CudaMemoryManager> cudaMemoryManager, + SPtr<CudaKernelManager> cudaKernelManager, + ADKernelManager* adKernelManager, + uint timestep) override; private: - //! \brief write binary VTK file as unstructured grid - //! \param para instance of classParameter - //! \param fname vector of strings with path and prefix of written files - void VIRTUALFLUIDS_GPU_EXPORT writeUnstrucuredGridLT(SPtr<Parameter> para, std::vector<std::string >& fname); + //! \brief write binary VTK file as unstructured grid + //! \param para instance of classParameter + //! \param fname vector of strings with path and prefix of written files + void VIRTUALFLUIDS_GPU_EXPORT writeUnstrucuredGridLT(SPtr<Parameter> para, std::vector<std::string >& fname); //! \brief write binary VTK file as unstructured grid with concentration of Advection Diffusion component //! \param para instance of classParameter //! \param fname vector of strings with path and prefix of written files void VIRTUALFLUIDS_GPU_EXPORT writeUnstrucuredGridAD(SPtr<Parameter> para, std::vector<std::string> &fname); //! \brief checks for periodic cells - //! \param para instance of classParameter - //! \param number 2, 1, 3 and 5 are the possible periodic neighbors - bool VIRTUALFLUIDS_GPU_EXPORT isPeriodicCell(SPtr<Parameter> para, uint number2, uint number1, uint number3, uint number5); + //! \param para instance of classParameter + //! \param number 2, 1, 3 and 5 are the possible periodic neighbors + bool VIRTUALFLUIDS_GPU_EXPORT isPeriodicCell(SPtr<Parameter> para, uint number2, uint number1, uint number3, uint number5); }; #endif \ No newline at end of file