VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
Side.h
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#ifndef SIDE_H
35#define SIDE_H
36
37#include <cstddef>
38#include <string>
39#include <vector>
40#include <map>
41#include <array>
42
44#include "lbm/constants/D3Q27.h"
45
46#define X_INDEX 0
47#define Y_INDEX 1
48#define Z_INDEX 2
49
50#define POSITIVE_DIR 1
51#define NEGATIVE_DIR -1
52
53namespace vf::gpu {
54
55class Grid;
56
57namespace grid_generator
58{
59class BoundaryCondition;
60}
61
62enum class SideType
63{
64 MX, PX, MY, PY, MZ, PZ, GEOMETRY
65};
66
67class Side
68{
69public:
70 virtual ~Side() = default;
71 virtual void addIndices(const std::vector<SPtr<Grid>> &grid, uint level,
72 SPtr<grid_generator::BoundaryCondition> boundaryCondition) = 0;
73
74 virtual int getCoordinate() const = 0;
75 virtual int getDirection() const = 0;
76
77 virtual SideType whoAmI() const = 0;
78
79 std::array<real, 3> getNormal() const;
80
81 size_t getD3Q27Direction() const;
82
83protected:
84 void addIndices(SPtr<Grid> grid, SPtr<grid_generator::BoundaryCondition> boundaryCondition, std::string coord, real constant,
86
87 void setQs(SPtr<Grid> grid, SPtr<grid_generator::BoundaryCondition> boundaryCondition, uint index);
88
89 virtual void correctNeighborForPeriodicBoundaries(const Grid *grid, std::array<real, 3>& coords, std::array<real, 3>& neighbors) const;
90
91 virtual bool isAlignedWithMyNormal(const Grid *grid, int dir) const;
92 bool isAlignedWithNormal(const Grid *grid, int dir, const std::array<real, 3>& normal) const;
93
94private:
95 static uint getIndex(SPtr<Grid> grid, std::string coord, real constant, real v1, real v2);
96 void resetDiagonalsInCaseOfOtherBC(Grid *grid, std::vector<real>& qNode, int dir, const std::array<real, 3> &coordinates, const std::vector<SideType>& BCAlreadySet) const;
97 std::array<real, 3> getNeighborCoordinates(Grid *grid, const std::array<real, 3> &coordinates,
98 size_t direction) const;
99 bool neighborNormalToSideIsAStopper(Grid *grid, const std::array<real, 3> &coordinates, SideType side) const;
100
101protected:
102 const std::map<SideType, const std::array<real, 3>> normals = {
103 { SideType::MX, { NEGATIVE_DIR, 0.0, 0.0 } }, { SideType::PX, { POSITIVE_DIR, 0.0, 0.0 } },
104 { SideType::MY, { 0.0, NEGATIVE_DIR, 0.0 } }, { SideType::PY, { 0.0, POSITIVE_DIR, 0.0 } },
105 { SideType::MZ, { 0.0, 0.0, NEGATIVE_DIR } }, { SideType::PZ, { 0.0, 0.0, POSITIVE_DIR } }
106 };
107 const std::map<SideType, size_t> sideToD3Q27 = {
108 { SideType::MX, vf::lbm::dir::dM00 }, { SideType::PX, vf::lbm::dir::dP00 },
109 { SideType::MY, vf::lbm::dir::d0M0 }, { SideType::PY, vf::lbm::dir::d0P0 },
110 { SideType::MZ, vf::lbm::dir::d00M }, { SideType::PZ, vf::lbm::dir::d00P }
111 };
112};
113
114class Geometry : public Side
115{
116public:
117 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
118
119 int getCoordinate() const override
120 {
121 return X_INDEX;
122 }
123
124 int getDirection() const override
125 {
126 return NEGATIVE_DIR;
127 }
128
129 SideType whoAmI() const override
130 {
131 return SideType::GEOMETRY;
132 }
133};
134
135class MX : public Side
136{
137public:
138 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
139
140 int getCoordinate() const override
141 {
142 return X_INDEX;
143 }
144
145 int getDirection() const override
146 {
147 return NEGATIVE_DIR;
148 }
149
150 SideType whoAmI() const override
151 {
152 return SideType::MX;
153 }
154};
155
156class PX : public Side
157{
158public:
159 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
160
161 int getCoordinate() const override
162 {
163 return X_INDEX;
164 }
165
166 int getDirection() const override
167 {
168 return POSITIVE_DIR;
169 }
170
171 SideType whoAmI() const override
172 {
173 return SideType::PX;
174 }
175};
176
177
178class MY : public Side
179{
180public:
181 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
182
183 int getCoordinate() const override
184 {
185 return Y_INDEX;
186 }
187
188 int getDirection() const override
189 {
190 return NEGATIVE_DIR;
191 }
192
193 SideType whoAmI() const override
194 {
195 return SideType::MY;
196 }
197};
198
199class PY : public Side
200{
201public:
202 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
203
204 int getCoordinate() const override
205 {
206 return Y_INDEX;
207 }
208
209 int getDirection() const override
210 {
211 return POSITIVE_DIR;
212 }
213
214 SideType whoAmI() const override
215 {
216 return SideType::PY;
217 }
218};
219
220
221class MZ : public Side
222{
223public:
224 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
225
226 int getCoordinate() const override
227 {
228 return Z_INDEX;
229 }
230
231 int getDirection() const override
232 {
233 return NEGATIVE_DIR;
234 }
235
236 SideType whoAmI() const override
237 {
238 return SideType::MZ;
239 }
240};
241
242class PZ : public Side
243{
244public:
245 void addIndices(const std::vector<SPtr<Grid>> &grid, uint level, SPtr<grid_generator::BoundaryCondition> boundaryCondition) override;
246
247 int getCoordinate() const override
248 {
249 return Z_INDEX;
250 }
251
252 int getDirection() const override
253 {
254 return POSITIVE_DIR;
255 }
256
257 SideType whoAmI() const override
258 {
259 return SideType::PZ;
260 }
261};
262
263
265{
266public:
268 {
269 switch (sideType)
270 {
271 case SideType::MX:
272 return SPtr<Side>(new MX());
273 case SideType::PX:
274 return SPtr<Side>(new PX());
275 case SideType::MY:
276 return SPtr<Side>(new MY());
277 case SideType::PY:
278 return SPtr<Side>(new PY());
279 case SideType::MZ:
280 return SPtr<Side>(new MZ());
281 case SideType::PZ:
282 return SPtr<Side>(new PZ());
284 return SPtr<Side>(new Geometry());
285 default:
286 throw std::runtime_error("SideFactory::make() - SideType not valid.");
287 }
288 }
289};
290
291}
292
293#endif
294
int getCoordinate() const override
Definition Side.h:119
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:232
SideType whoAmI() const override
Definition Side.h:129
int getDirection() const override
Definition Side.h:124
int getDirection() const override
Definition Side.h:145
int getCoordinate() const override
Definition Side.h:140
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:275
SideType whoAmI() const override
Definition Side.h:150
SideType whoAmI() const override
Definition Side.h:193
int getDirection() const override
Definition Side.h:188
int getCoordinate() const override
Definition Side.h:183
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:306
SideType whoAmI() const override
Definition Side.h:236
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:338
int getCoordinate() const override
Definition Side.h:226
int getDirection() const override
Definition Side.h:231
SideType whoAmI() const override
Definition Side.h:171
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:291
int getCoordinate() const override
Definition Side.h:161
int getDirection() const override
Definition Side.h:166
SideType whoAmI() const override
Definition Side.h:214
int getCoordinate() const override
Definition Side.h:204
int getDirection() const override
Definition Side.h:209
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:322
SideType whoAmI() const override
Definition Side.h:257
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
Definition Side.cpp:353
int getCoordinate() const override
Definition Side.h:247
int getDirection() const override
Definition Side.h:252
static SPtr< Side > make(SideType sideType)
Definition Side.h:267
const std::map< SideType, size_t > sideToD3Q27
Definition Side.h:107
virtual int getDirection() const =0
size_t getD3Q27Direction() const
Definition Side.cpp:63
virtual bool isAlignedWithMyNormal(const Grid *grid, int dir) const
Definition Side.cpp:179
virtual void correctNeighborForPeriodicBoundaries(const Grid *grid, std::array< real, 3 > &coords, std::array< real, 3 > &neighbors) const
Definition Side.cpp:192
virtual ~Side()=default
virtual int getCoordinate() const =0
void setQs(SPtr< Grid > grid, SPtr< grid_generator::BoundaryCondition > boundaryCondition, uint index)
Definition Side.cpp:109
virtual SideType whoAmI() const =0
void addIndices(SPtr< Grid > grid, SPtr< grid_generator::BoundaryCondition > boundaryCondition, std::string coord, real constant, real startInner, real endInner, real startOuter, real endOuter)
virtual void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition)=0
const std::map< SideType, const std::array< real, 3 > > normals
Definition Side.h:102
std::array< real, 3 > getNormal() const
Definition Side.cpp:51
bool isAlignedWithNormal(const Grid *grid, int dir, const std::array< real, 3 > &normal) const
Definition Side.cpp:185
std::shared_ptr< T > SPtr
float real
Definition DataTypes.h:42
unsigned int uint
Definition DataTypes.h:47
#define X_INDEX
Definition Side.h:46
#define Y_INDEX
Definition Side.h:47
#define POSITIVE_DIR
Definition Side.h:50
#define NEGATIVE_DIR
Definition Side.h:51
#define Z_INDEX
Definition Side.h:48
SideType
Definition Side.h:63