VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
RunAdvectionDiffusionCollision.cuh
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//
29//! \addtogroup gpu_Utilities Utilities
30//! \ingroup gpu_core core
31//! \{
32//! \author Henry Korb
33//=======================================================================================
34#include <basics/DataTypes.h>
35
36#include <lbm/advectionDiffusion/collision/CollisionParameter.h>
37#include <lbm/collision/TurbulentViscosity.h>
38#include <lbm/advectionDiffusion/TurbulentDiffusivity.h>
39
40#include "KernelUtilities.h"
41#include "core/Calculation/Calculation.h"
42#include "gpu/cuda_helper/CudaIndexCalculation.h"
43#include "core/Parameter/Parameter.h"
44
45namespace vf::gpu::ad
46{
47
48struct GPUCollisionParameters
49{
50 unsigned long long numberOfLBnodes;
51 bool isEvenTimestep;
52 real relaxationFrequency;
53 const uint* typeOfGridNode;
54 real* distributions;
55 const uint *neighborX, *neighborY, *neighborZ;
56 const real *velocityX, *velocityY, *velocityZ;
57 real* concentration;
58 real turbulentPrandtlNumber;
59 const real* turbulentViscosity;
60 real* turbulentDiffusivity;
61 const uint* indices;
62 uint numberOfFluidNodes;
63};
64
65inline GPUCollisionParameters getCollisionParameter(LBMSimulationParameter* parD, real turbulentPrandtlNumber,
66 const uint* indices, uint sizeIndices)
67{
68 return { parD->numberOfNodes,
69 parD->isEvenTimestep,
70 parD->omegaDiffusivity,
71 parD->typeOfGridNode,
72 parD->distributionsAD.f[0],
73 parD->neighborX,
74 parD->neighborY,
75 parD->neighborZ,
76 parD->velocityX,
77 parD->velocityY,
78 parD->velocityZ,
79 parD->concentration,
80 turbulentPrandtlNumber,
81 parD->turbulentViscosity,
82 parD->turbulentDiffusivity,
83 indices,
84 sizeIndices };
85}
86
87template <typename CollisionFunctor, vf::lbm::advection_diffusion::TurbulenceModel turbulenceModel>
88__global__ void runCollisionAdvectionDiffusion(CollisionFunctor collision, GPUCollisionParameters collisionParameter)
89{
90 using namespace vf::lbm::advection_diffusion;
91 using namespace vf::basics::constant;
92 const uint nodeIndex = vf::cuda::get1DIndexFrom2DBlock();
93
94 if (nodeIndex >= collisionParameter.numberOfFluidNodes)
95 return;
96
97 const uint k_000 = collisionParameter.indices[nodeIndex];
98 if (collisionParameter.typeOfGridNode[k_000] != GEO_FLUID) {
99 collisionParameter.concentration[k_000] = c0o1;
100 return;
101 }
102
103 ////////////////////////////////////////////////////////////////////////////////
104 Distributions27 distAD = getDistributionReferences27(
105 collisionParameter.distributions, collisionParameter.numberOfLBnodes, collisionParameter.isEvenTimestep);
106 const ListIndices listIndices(k_000, collisionParameter.neighborX, collisionParameter.neighborY,
107 collisionParameter.neighborZ);
108
109 ADCollisionParameter para;
110 getPreCollisionDistribution(para.distribution, distAD, listIndices);
111
112 switch (turbulenceModel) {
113 case TurbulenceModel::None:
114 para.omega = collisionParameter.relaxationFrequency;
115 break;
116 case TurbulenceModel::Default: {
117 const real turbulentDiffusivity = calcTurbulentDiffusivityDefault(
118 collisionParameter.turbulentViscosity[k_000], collisionParameter.turbulentPrandtlNumber);
119 para.omega =
120 vf::lbm::calculateOmegaWithTurbulentViscosity(collisionParameter.relaxationFrequency, turbulentDiffusivity);
121 collisionParameter.turbulentDiffusivity[k_000] = turbulentDiffusivity;
122 } break;
123 case TurbulenceModel::Moeng:
124 case TurbulenceModel::AMDStratified:
125 para.omega = vf::lbm::calculateOmegaWithTurbulentViscosity(collisionParameter.relaxationFrequency,
126 collisionParameter.turbulentDiffusivity[k_000]);
127 break;
128 }
129
130 para.velocityX = collisionParameter.velocityX[k_000];
131 para.velocityY = collisionParameter.velocityY[k_000];
132 para.velocityZ = collisionParameter.velocityZ[k_000];
133
134 collision(para);
135
136 setPostCollisionDistribution(distAD, listIndices, para.distribution);
137
138 collisionParameter.concentration[k_000] = para.concentration;
139}
140
141} // namespace vf::gpu