1//=======================================================================================
2// ____ ____ __ ______ __________ __ __ __ __
3// \ \ | | | | | _ \ |___ ___| | | | | / \ | |
4// \ \ | | | | | |_) | | | | | | | / \ | |
5// \ \ | | | | | _ / | | | | | | / /\ \ | |
6// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____
7// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______|
8// \ \ | | ________________________________________________________________
9// \ \ | | | ______________________________________________________________|
10// \ \| | | | __ __ __ __ ______ _______
11// \ | | |_____ | | | | | | | | | _ \ / _____)
12// \ | | _____| | | | | | | | | | | \ \ \_______
13// \ | | | | |_____ | \_/ | | | | |_/ / _____ |
14// \ _____| |__| |________| \_______/ |__| |______/ (_______/
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.
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
26// SPDX-License-Identifier: GPL-3.0-or-later
27// SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
29//! \addtogroup gpu_Utilities Utilities
30//! \ingroup gpu_core core
33//=======================================================================================
34#include <basics/DataTypes.h>
36#include <lbm/advectionDiffusion/collision/CollisionParameter.h>
37#include <lbm/collision/TurbulentViscosity.h>
38#include <lbm/advectionDiffusion/TurbulentDiffusivity.h>
40#include "KernelUtilities.h"
41#include "core/Calculation/Calculation.h"
42#include "gpu/cuda_helper/CudaIndexCalculation.h"
43#include "core/Parameter/Parameter.h"
48struct GPUCollisionParameters
50 unsigned long long numberOfLBnodes;
52 real relaxationFrequency;
53 const uint* typeOfGridNode;
55 const uint *neighborX, *neighborY, *neighborZ;
56 const real *velocityX, *velocityY, *velocityZ;
58 real turbulentPrandtlNumber;
59 const real* turbulentViscosity;
60 real* turbulentDiffusivity;
62 uint numberOfFluidNodes;
65inline GPUCollisionParameters getCollisionParameter(LBMSimulationParameter* parD, real turbulentPrandtlNumber,
66 const uint* indices, uint sizeIndices)
68 return { parD->numberOfNodes,
70 parD->omegaDiffusivity,
72 parD->distributionsAD.f[0],
80 turbulentPrandtlNumber,
81 parD->turbulentViscosity,
82 parD->turbulentDiffusivity,
87template <typename CollisionFunctor, vf::lbm::advection_diffusion::TurbulenceModel turbulenceModel>
88__global__ void runCollisionAdvectionDiffusion(CollisionFunctor collision, GPUCollisionParameters collisionParameter)
90 using namespace vf::lbm::advection_diffusion;
91 using namespace vf::basics::constant;
92 const uint nodeIndex = vf::cuda::get1DIndexFrom2DBlock();
94 if (nodeIndex >= collisionParameter.numberOfFluidNodes)
97 const uint k_000 = collisionParameter.indices[nodeIndex];
98 if (collisionParameter.typeOfGridNode[k_000] != GEO_FLUID) {
99 collisionParameter.concentration[k_000] = c0o1;
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);
109 ADCollisionParameter para;
110 getPreCollisionDistribution(para.distribution, distAD, listIndices);
112 switch (turbulenceModel) {
113 case TurbulenceModel::None:
114 para.omega = collisionParameter.relaxationFrequency;
116 case TurbulenceModel::Default: {
117 const real turbulentDiffusivity = calcTurbulentDiffusivityDefault(
118 collisionParameter.turbulentViscosity[k_000], collisionParameter.turbulentPrandtlNumber);
120 vf::lbm::calculateOmegaWithTurbulentViscosity(collisionParameter.relaxationFrequency, turbulentDiffusivity);
121 collisionParameter.turbulentDiffusivity[k_000] = turbulentDiffusivity;
123 case TurbulenceModel::Moeng:
124 case TurbulenceModel::AMDStratified:
125 para.omega = vf::lbm::calculateOmegaWithTurbulentViscosity(collisionParameter.relaxationFrequency,
126 collisionParameter.turbulentDiffusivity[k_000]);
130 para.velocityX = collisionParameter.velocityX[k_000];
131 para.velocityY = collisionParameter.velocityY[k_000];
132 para.velocityZ = collisionParameter.velocityZ[k_000];
136 setPostCollisionDistribution(distAD, listIndices, para.distribution);
138 collisionParameter.concentration[k_000] = para.concentration;
141} // namespace vf::gpu