VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
UpdateGrid27.cpp
Go to the documentation of this file.
1//=======================================================================================
2// ____ ____ __ ______ __________ __ __ __ __
3// \ \ | | | | | _ \ |___ ___| | | | | / \ | |
4// \ \ | | | | | |_) | | | | | | | / \ | |
5// \ \ | | | | | _ / | | | | | | / /\ \ | |
6// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____
7// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______|
8// \ \ | | ________________________________________________________________
9// \ \ | | | ______________________________________________________________|
10// \ \| | | | __ __ __ __ ______ _______
11// \ | | |_____ | | | | | | | | | _ \ / _____)
12// \ | | _____| | | | | | | | | | | \ \ \_______
13// \ | | | | |_____ | \_/ | | | | |_/ / _____ |
14// \ _____| |__| |________| \_______/ |__| |______/ (_______/
15//
16// This file is part of VirtualFluids. VirtualFluids is free software: you can
17// redistribute it and/or modify it under the terms of the GNU General Public
18// License as published by the Free Software Foundation, either version 3 of
19// the License, or (at your option) any later version.
20//
21// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
22// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24// for more details.
25//
26// SPDX-License-Identifier: GPL-3.0-or-later
27// SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
28//
33//=======================================================================================
34#include "UpdateGrid27.h"
35
36#include <cuda_runtime.h>
37#include <helper_cuda.h>
38
39#include <logger/Logger.h>
40
42
44#include "CollisionStrategy.h"
49#include "Kernel/Kernel.h"
53
54namespace vf::gpu {
55
56void UpdateGrid27::updateGrid(int level, unsigned int t)
57{
59
60 if (level != para->getFine()) {
61 updateGrid(level + 1, t);
62 updateGrid(level + 1, t);
63 }
64
66
67 sample(level, t);
68
70
71 collision(this, para.get(), level, t);
72
74
75 postCollisionBC(level, t);
76
78
79 swapBetweenEvenAndOddTimestep(level);
80
82
83 calcTurbulentViscosity(level);
84
86
87 this->preCollisionBC(level, t);
88
90 if (level != para->getFine()) {
91 refinement(this, para.get(), level);
92 }
93
95
96 interact(level, t);
97
98}
99
100void UpdateGrid27::collisionAllNodes(int level, unsigned int t)
101{
102 kernels.at(level)->run();
103
104 if (para->getDiffOn())
105 kernelsAD.at(level)->run();
106}
107
108void UpdateGrid27::collisionUsingIndices(int level, unsigned int t, uint *taggedFluidNodeIndices, uint numberOfTaggedFluidNodes, CollisionTemplate collisionTemplate, CudaStreamIndex stream)
109{
110 if (taggedFluidNodeIndices != nullptr && numberOfTaggedFluidNodes != 0)
111 kernels.at(level)->runOnIndices(taggedFluidNodeIndices, numberOfTaggedFluidNodes, collisionTemplate, stream);
112 else
113 VF_LOG_CRITICAL("In collision: fluidNodeIndices or numberOfFluidNodes not defined (level = {})", level);
114
116
117 if (para->getDiffOn())
118 kernelsAD.at(level)->runOnIndices(taggedFluidNodeIndices, numberOfTaggedFluidNodes, collisionTemplate, stream);
119}
120
121void UpdateGrid27::prepareExchangeMultiGPU(int level, CudaStreamIndex streamIndex)
122{
123 prepareExchangeCollDataXGPU27AllNodes(para.get(), level, streamIndex);
124 prepareExchangeCollDataYGPU27AllNodes(para.get(), level, streamIndex);
125 prepareExchangeCollDataZGPU27AllNodes(para.get(), level, streamIndex);
126}
127
128void UpdateGrid27::prepareExchangeMultiGPUAfterFtoC(int level, CudaStreamIndex streamIndex)
129{
130 prepareExchangeCollDataXGPU27AfterFtoC(para.get(), level, streamIndex);
131 prepareExchangeCollDataYGPU27AfterFtoC(para.get(), level, streamIndex);
132 prepareExchangeCollDataZGPU27AfterFtoC(para.get(), level, streamIndex);
133}
134
135void UpdateGrid27::exchangeMultiGPU(int level, CudaStreamIndex streamIndex)
136{
138 // 3D domain decomposition
139 exchangeCollDataXGPU27AllNodes(para.get(), comm, cudaMemoryManager.get(), level, streamIndex);
140 exchangeCollDataYGPU27AllNodes(para.get(), comm, cudaMemoryManager.get(), level, streamIndex);
141 exchangeCollDataZGPU27AllNodes(para.get(), comm, cudaMemoryManager.get(), level, streamIndex);
142 scatterNodesFromRecvBufferXGPU27AllNodes(para.get(), level, streamIndex);
143 scatterNodesFromRecvBufferYGPU27AllNodes(para.get(), level, streamIndex);
144 scatterNodesFromRecvBufferZGPU27AllNodes(para.get(), level, streamIndex);
145}
146void UpdateGrid27::exchangeMultiGPU_noStreams_withPrepare(int level, bool useReducedComm)
147{
149 // 3D domain decomposition
150 if (useReducedComm) {
151 // X
153 exchangeCollDataXGPU27AfterFtoC(para.get(), comm, cudaMemoryManager.get(), level, CudaStreamIndex::Legacy);
155 // Y
157 exchangeCollDataYGPU27AfterFtoC(para.get(), comm, cudaMemoryManager.get(), level, CudaStreamIndex::Legacy);
159 // Z
161 exchangeCollDataZGPU27AfterFtoC(para.get(), comm, cudaMemoryManager.get(), level, CudaStreamIndex::Legacy);
163 } else {
164 // X
166 exchangeCollDataXGPU27AllNodes(para.get(), comm, cudaMemoryManager.get(), level, CudaStreamIndex::Legacy);
168 // Y
170 exchangeCollDataYGPU27AllNodes(para.get(), comm, cudaMemoryManager.get(), level, CudaStreamIndex::Legacy);
172 // Z
174 exchangeCollDataZGPU27AllNodes(para.get(), comm, cudaMemoryManager.get(), level, CudaStreamIndex::Legacy);
176 }
177}
178void UpdateGrid27::exchangeMultiGPUAfterFtoC(int level, CudaStreamIndex streamIndex)
179{
181 // 3D domain decomposition
182 exchangeCollDataXGPU27AfterFtoC(para.get(), comm, cudaMemoryManager.get(), level, streamIndex);
183 exchangeCollDataYGPU27AfterFtoC(para.get(), comm, cudaMemoryManager.get(), level, streamIndex);
184 exchangeCollDataZGPU27AfterFtoC(para.get(), comm, cudaMemoryManager.get(), level, streamIndex);
185
186 scatterNodesFromRecvBufferXGPU27AfterFtoC(para.get(), level, streamIndex);
187 scatterNodesFromRecvBufferYGPU27AfterFtoC(para.get(), level, streamIndex);
188 scatterNodesFromRecvBufferZGPU27AfterFtoC(para.get(), level, streamIndex);
189}
190
191void UpdateGrid27::postCollisionBC(int level, uint t)
192{
194 // G E O M E T R Y
195 // V E L O C I T Y (I N F L O W)
196 this->bcKernelManager->runVelocityBCKernelPost(level);
197
199 // N O - S L I P
200 this->bcKernelManager->runNoSlipBCKernelPost(level);
201
203 // S L I P
204 this->bcKernelManager->runSlipBCKernelPost(level);
205
207 // S T R E S S (wall model)
208 this->bcKernelManager->runStressWallModelKernelPost(level);
209
211 // G E O M E T R Y
212 this->bcKernelManager->runGeoBCKernelPost(level);
213
215 // P R E C U R S O R
216 this->bcKernelManager->runPrecursorBCKernelPost(level, t, cudaMemoryManager.get());
217
219 // A D V E C T I O N D I F F U S I O N
220 if (para->getDiffOn())
221 {
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);
228
229 }
230}
231
232void UpdateGrid27::swapBetweenEvenAndOddTimestep(int level)
233{
234 if (para->getParD(level)->isEvenTimestep==true) para->getParD(level)->isEvenTimestep=false;
235 else para->getParD(level)->isEvenTimestep=true;
236}
237
238void UpdateGrid27::calcMacroscopicQuantities(int level)
239{
240 calculateMacroscopicQuantitiesCompressible(para->getParD(level)->velocityX,
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);
253 getLastCudaError("calculateMacroscopicQuantities execution failed");
254}
255
256void UpdateGrid27::preCollisionBC(int level, unsigned int t)
257{
259 // V E L O C I T Y (I N F L O W)
260 this->bcKernelManager->runVelocityBCKernelPre(level);
261
263 // G E O M E T R Y
264 this->bcKernelManager->runGeoBCKernelPre(level, t, cudaMemoryManager.get());
265
267 // P R E S S U R E
268 this->bcKernelManager->runPressureBCKernelPre(level);
269
272 //para->cudaCopyTestREtoHost(0,para->getParH(0)->pressureBC.numberOfBCnodes);
273 //printRE(para, t);
275}
276
277void UpdateGrid27::fineToCoarse(int level, InterpolationCells* fineToCoarse, ICellNeigh &neighborFineToCoarse, CudaStreamIndex streamIndex)
278{
279 gridScalingKernelManager->runFineToCoarseKernelLB(level, fineToCoarse, neighborFineToCoarse, streamIndex);
280}
281
282void UpdateGrid27::coarseToFine(int level, InterpolationCells* coarseToFine, ICellNeigh &neighborCoarseToFine, CudaStreamIndex streamIndex)
283{
284 this->gridScalingKernelManager->runCoarseToFineKernelLB(level, coarseToFine, neighborCoarseToFine, streamIndex);
285}
286
287void UpdateGrid27::interact(int level, unsigned int t)
288{
289 for( SPtr<PreCollisionInteractor> interactor: para->getInteractors() )
290 {
291 interactor->interact(level, t);
292 }
293}
294
295void UpdateGrid27::sample(int level, unsigned int t)
296{
297 for( SPtr<Sampler> sampler: para->getSamplers() )
298 {
299 sampler->sample(level, t);
300 }
301}
302
303void UpdateGrid27::calcTurbulentViscosity(int level)
304{
305 this->tmManager->runTurbulenceModelKernel(level);
306 if(para->getDiffOn())
307 this->tmManager->runTurbulenceModelADKernel(level);
308}
309
311{
312 exchangeMultiGPU_noStreams_withPrepare(level, false);
313}
314
316 std::vector<SPtr<Kernel>>& kernels,
317 std::vector<SPtr<AdvectionDiffusionKernel>>& kernelsAD, const BoundaryConditionFactory* bcFactory,
318 SPtr<TurbulenceModelFactory> tmFactory, GridScalingFactory* scalingFactory)
319 : para(para), comm(comm), cudaMemoryManager(cudaMemoryManager), kernels(kernels), kernelsAD(kernelsAD)
320{
321 this->collision = getFunctionForCollisionAndExchange(para->getUseStreams(), para->getNumprocs(), para->getKernelNeedsFluidNodeIndicesToRun());
322 this->refinement = getFunctionForRefinementAndExchange(para->getUseStreams(), para->getNumprocs(), para->getMaxLevel(), para->useReducedCommunicationAfterFtoC);
323
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);
327}
328
329}
330
#define VF_LOG_CRITICAL(...)
Definition Logger.h:52
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
unsigned int uint
Definition DataTypes.h:47
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)
Definition Calculation.h:57
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
Definition Calculation.h:81
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.