36#include <cuda_runtime.h>
37#include <helper_cuda.h>
60 if (level != para->getFine()) {
71 collision(
this, para.get(), level,
t);
75 postCollisionBC(level,
t);
79 swapBetweenEvenAndOddTimestep(level);
83 calcTurbulentViscosity(level);
87 this->preCollisionBC(level,
t);
90 if (level != para->getFine()) {
91 refinement(
this, para.get(), level);
100void UpdateGrid27::collisionAllNodes(
int level,
unsigned int t)
102 kernels.at(level)->run();
104 if (para->getDiffOn())
105 kernelsAD.at(level)->run();
110 if (taggedFluidNodeIndices !=
nullptr && numberOfTaggedFluidNodes != 0)
113 VF_LOG_CRITICAL(
"In collision: fluidNodeIndices or numberOfFluidNodes not defined (level = {})", level);
117 if (para->getDiffOn())
118 kernelsAD.at(level)->runOnIndices(taggedFluidNodeIndices, numberOfTaggedFluidNodes,
collisionTemplate,
stream);
121void UpdateGrid27::prepareExchangeMultiGPU(
int level,
CudaStreamIndex streamIndex)
128void UpdateGrid27::prepareExchangeMultiGPUAfterFtoC(
int level,
CudaStreamIndex streamIndex)
135void UpdateGrid27::exchangeMultiGPU(
int level,
CudaStreamIndex streamIndex)
146void UpdateGrid27::exchangeMultiGPU_noStreams_withPrepare(
int level,
bool useReducedComm)
178void UpdateGrid27::exchangeMultiGPUAfterFtoC(
int level,
CudaStreamIndex streamIndex)
191void UpdateGrid27::postCollisionBC(
int level,
uint t)
196 this->bcKernelManager->runVelocityBCKernelPost(level);
200 this->bcKernelManager->runNoSlipBCKernelPost(level);
204 this->bcKernelManager->runSlipBCKernelPost(level);
208 this->bcKernelManager->runStressWallModelKernelPost(level);
212 this->bcKernelManager->runGeoBCKernelPost(level);
216 this->bcKernelManager->runPrecursorBCKernelPost(level,
t, cudaMemoryManager.get());
220 if (para->getDiffOn())
222 this->bcKernelManager->runADNoFluxBCKernel(level);
223 this->bcKernelManager->runADFluxBCKernel(level);
224 this->bcKernelManager->runADDirichletBCKernel(level);
225 this->bcKernelManager->runADNeumannBCKernel(level);
226 this->bcKernelManager->runADDirectionalBCKernel(level);
227 this->bcKernelManager->runSurfaceLayerBCKernelPost(level);
232void UpdateGrid27::swapBetweenEvenAndOddTimestep(
int level)
234 if (para->getParD(level)->isEvenTimestep==
true) para->getParD(level)->isEvenTimestep=
false;
235 else para->getParD(level)->isEvenTimestep=
true;
238void UpdateGrid27::calcMacroscopicQuantities(
int level)
241 para->getParD(level)->velocityY,
242 para->getParD(level)->velocityZ,
243 para->getParD(level)->rho,
244 para->getParD(level)->pressure,
245 para->getParD(level)->typeOfGridNode,
246 para->getParD(level)->neighborX,
247 para->getParD(level)->neighborY,
248 para->getParD(level)->neighborZ,
249 para->getParD(level)->numberOfNodes,
250 para->getParD(level)->numberofthreads,
251 para->getParD(level)->distributions.f[0],
252 para->getParD(level)->isEvenTimestep);
256void UpdateGrid27::preCollisionBC(
int level,
unsigned int t)
260 this->bcKernelManager->runVelocityBCKernelPre(level);
264 this->bcKernelManager->runGeoBCKernelPre(level,
t, cudaMemoryManager.get());
268 this->bcKernelManager->runPressureBCKernelPre(level);
279 gridScalingKernelManager->runFineToCoarseKernelLB(level, fineToCoarse, neighborFineToCoarse, streamIndex);
284 this->gridScalingKernelManager->runCoarseToFineKernelLB(level, coarseToFine, neighborCoarseToFine, streamIndex);
287void UpdateGrid27::interact(
int level,
unsigned int t)
291 interactor->interact(level,
t);
295void UpdateGrid27::sample(
int level,
unsigned int t)
303void UpdateGrid27::calcTurbulentViscosity(
int level)
305 this->tmManager->runTurbulenceModelKernel(level);
306 if(para->getDiffOn())
307 this->tmManager->runTurbulenceModelADKernel(level);
312 exchangeMultiGPU_noStreams_withPrepare(level,
false);
319 : para(para), comm(comm), cudaMemoryManager(cudaMemoryManager), kernels(kernels), kernelsAD(kernelsAD)
324 this->bcKernelManager = std::make_shared<BoundaryConditionKernelManager>(para, bcFactory);
325 this->gridScalingKernelManager = std::make_shared<GridScalingKernelManager>(para, scalingFactory);
326 this->tmManager = std::make_shared<TurbulenceModelManager>(para, tmFactory);
#define VF_LOG_CRITICAL(...)
void updateGrid(int level, unsigned int t)
UpdateGrid27(SPtr< Parameter > para, vf::parallel::Communicator &comm, SPtr< CudaMemoryManager > cudaMemoryManager, std::vector< SPtr< Kernel > > &kernels, std::vector< SPtr< AdvectionDiffusionKernel > > &kernelsAD, const BoundaryConditionFactory *bcFactory, SPtr< TurbulenceModelFactory > tmFactory, GridScalingFactory *scalingFactory)
void exchangeData(int level)
An abstract class for communication between processes in parallel computation.
std::shared_ptr< T > SPtr
void scatterNodesFromRecvBufferZGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex)
std::function< void(UpdateGrid27 *updateGrid, Parameter *para, int level)> getFunctionForRefinementAndExchange(const bool useStreams, const int numberOfMpiProcesses, const int maxLevel, const bool useReducedCommunicationAfterFtoC) noexcept
get a function which performs the interpolation between grid levels and performs the communication be...
void exchangeCollDataYGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator &comm, const CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex)
std::function< void(UpdateGrid27 *updateGrid, Parameter *para, int level, unsigned int t)> getFunctionForCollisionAndExchange(const bool useStreams, const int numberOfMpiProcesses, const bool kernelNeedsFluidNodeIndicesToRun)
get a function which performs the collision operator and performs the communication between gpus/ pro...
void scatterNodesFromRecvBufferZGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex)
void scatterNodesFromRecvBufferXGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex)
Distribute the receive nodes (x direction) from the buffer on the gpu.
void exchangeCollDataZGPU27AllNodes(Parameter *para, vf::parallel::Communicator &comm, const CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex)
void prepareExchangeCollDataYGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex)
void prepareExchangeCollDataYGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex)
void scatterNodesFromRecvBufferYGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex)
CollisionTemplate
An enumeration for selecting a template of the collision kernel (CumulantK17)
void exchangeCollDataYGPU27AllNodes(Parameter *para, vf::parallel::Communicator &comm, const CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex)
void exchangeCollDataXGPU27AllNodes(Parameter *para, vf::parallel::Communicator &comm, const CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex)
Calls exchangeCollDataXGPU27() for exchanging all nodes.
void exchangeCollDataZGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator &comm, const CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex)
void scatterNodesFromRecvBufferYGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex)
void exchangeCollDataXGPU27AfterFtoC(Parameter *para, vf::parallel::Communicator &comm, const CudaMemoryManager *cudaMemoryManager, int level, CudaStreamIndex streamIndex)
Calls exchangeCollDataGPU27() for exchanging the nodes, which are part of the communication between t...
void prepareExchangeCollDataXGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex)
Collect the send nodes for communication in the x direction in a buffer on the gpu.
void prepareExchangeCollDataZGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex)
ICells InterpolationCells
void prepareExchangeCollDataZGPU27AfterFtoC(Parameter *para, int level, CudaStreamIndex streamIndex)
void scatterNodesFromRecvBufferXGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex)
Distribute the receive nodes (x direction) from the buffer on the gpu.
void prepareExchangeCollDataXGPU27AllNodes(Parameter *para, int level, CudaStreamIndex streamIndex)
Collect the send nodes for communication in the x direction in a buffer on the gpu.