VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
SlipBounceBack.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_BoundaryConditions BoundaryConditions
30//! \ingroup gpu_core core
31//! \{
32//! \author Henry Korb
33//======================================================================================
34#include "Calculation/Calculation.h"
35#include "Utilities/KernelUtilities.h"
36#include "basics/constants/NumericConstants.h"
37#include "cuda_helper/CudaIndexCalculation.h"
38#include "lbm/MacroscopicQuantities.h"
39#include "lbm/constants/D3Q27.h"
40
41using namespace vf::basics::constant;
42using namespace vf::lbm::dir;
43
44namespace vf::gpu {
45
46__global__ void SlipBounceBack_Device(real* populationsArray, QforBoundaryConditions bcParams,
47 const uint* neighborX, const uint* neighborY,
48 const uint* neighborZ, const unsigned long long numberOfLBnodes,
49 const bool isEvenTimestep)
50{
51
52 const uint nodeIndex = vf::cuda::get1DIndexFrom2DBlock();
53
54 if (nodeIndex >= bcParams.numberOfBCnodes)
55 return;
56 Distributions27 populationReferences;
57 getPointersToDistributions(populationReferences, populationsArray, numberOfLBnodes, isEvenTimestep);
58
59 SubgridDistances27 subgridD;
60 getPointersToSubgridDistances(subgridD, bcParams.q27[0], bcParams.numberOfBCnodes);
61
62 const uint indexOfBCnode = bcParams.k[nodeIndex];
63 const ListIndices listIndices(indexOfBCnode, neighborX, neighborY, neighborZ);
64
65 real populations[NUMBER_Of_DIRECTIONS];
66 getPostCollisionDistribution(populations, populationReferences, listIndices);
67
68 const real drho = vf::lbm::getDensity(populations);
69 const real3 velocity { vf::lbm::getCompressibleVelocityX1(populations, drho),
70 vf::lbm::getCompressibleVelocityX2(populations, drho),
71 vf::lbm::getCompressibleVelocityX3(populations, drho) };
72
73 const real3 normal { bcParams.normalX[nodeIndex], bcParams.normalY[nodeIndex], bcParams.normalZ[nodeIndex] };
74
75 const real3 velocityTangential = velocity - normal * dot(normal, velocity);
76
77 // getPointersToDistributions(populationReferences, populationsArray, numberOfLBnodes, !isEvenTimestep);
78
79 forEachNonRestDirection([&](auto dir) {
80 const real subgridDistance = (subgridD.q[dir])[nodeIndex];
81 if (subgridDistance > c1o1 || subgridDistance < c0o1)
82 return;
83 const real weight = getWeight<dir>();
84 const real velocity = getVelocity<dir>(velocityTangential.x, velocityTangential.y, velocityTangential.z);
85 const real population = getBounceBackDistributionForVeloBC(populations[dir], velocity, weight);
86 writeInInverseDirection<dir>(population, listIndices, populationReferences);
87 });
88}
89
90}