VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
Grid.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 GRID_H
35#define GRID_H
36
38
40
42
43namespace vf::gpu {
44
45class TriangularMesh;
46struct Vertex;
47struct Triangle;
48class GridInterface;
49class Object;
50class BoundingBox;
51enum class SideType;
52
53class Grid
54{
55public:
56 virtual ~Grid() = default;
57
58 virtual SPtr<const Object> getObject() const = 0;
59
60 virtual real getDelta() const = 0;
61 virtual uint getSparseSize() const = 0;
62 virtual uint getSize() const = 0;
63
64 virtual real getStartX() const = 0;
65 virtual real getStartY() const = 0;
66 virtual real getStartZ() const = 0;
67
68 virtual real getEndX() const = 0;
69 virtual real getEndY() const = 0;
70 virtual real getEndZ() const = 0;
71
72 virtual Vertex getMinimumOnNode(Vertex exact) const = 0;
73 virtual Vertex getMaximumOnNode(Vertex exact) const = 0;
74
75 virtual uint getNumberOfNodesX() const = 0;
76 virtual uint getNumberOfNodesY() const = 0;
77 virtual uint getNumberOfNodesZ() const = 0;
78
79 virtual uint getNumberOfNodesCF() const = 0;
80 virtual uint getNumberOfNodesFC() const = 0;
81
82 virtual int getSparseIndex(uint matrixIndex) const = 0;
83 virtual char getFieldEntry(uint matrixIndex) const = 0;
84 virtual void setFieldEntry(uint matrixIndex, char type) = 0;
85
88
89 virtual bool isStopperForBC(uint index) const = 0;
90
91 virtual int *getNeighborsX() const = 0;
92 virtual int *getNeighborsY() const = 0;
93 virtual int *getNeighborsZ() const = 0;
94 virtual int *getNeighborsNegative() const = 0;
95
96 virtual uint *getCF_coarse() const = 0;
97 virtual uint *getCF_fine() const = 0;
98 virtual uint *getCF_offset() const = 0;
99
100 virtual uint *getFC_coarse() const = 0;
101 virtual uint *getFC_fine() const = 0;
102 virtual uint *getFC_offset() const = 0;
103
104 virtual real *getDistribution() const = 0;
105 virtual const std::vector<int> &getDirection() const = 0;
106 virtual int getStartDirection() const = 0;
107 virtual int getEndDirection() const = 0;
108
109 virtual void getNodeValues(real *xCoords, real *yCoords, real *zCoords, uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, uint *geo) const = 0;
110
111 virtual void transIndexToCoords(uint index, real &x, real &y, real &z) const = 0;
112 virtual uint transCoordToIndex(const real &x, const real &y, const real &z) const = 0;
113
114 virtual void inital(const SPtr<Grid> fineGrid, uint numberOfLayers) = 0;
115
116 virtual void setOddStart(bool xOddStart, bool yOddStart, bool zOddStart) = 0;
117
118 virtual void findGridInterface(SPtr<Grid> grid) = 0;
119
121
122 virtual void limitToSubDomain(SPtr<BoundingBox> subDomainBox) = 0;
123
125 virtual void enableComputeQs() = 0;
126
127 virtual void mesh(TriangularMesh &geometry) = 0;
128 virtual void mesh(Object *object) = 0;
129
130 virtual void closeNeedleCells() = 0;
131 virtual void closeNeedleCellsThinWall() = 0;
132
133 virtual void beginQComputation() = 0;
134 virtual void findQs(Object *object) = 0;
139 virtual void finalizeQComputation() = 0;
140
141 virtual void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) = 0;
142 virtual void setPeriodicityX(bool periodicity) = 0;
143 virtual void setPeriodicityY(bool periodicity) = 0;
144 virtual void setPeriodicityZ(bool periodicity) = 0;
145
146 virtual bool getPeriodicityX() const = 0;
147 virtual bool getPeriodicityY() const = 0;
148 virtual bool getPeriodicityZ() const = 0;
149
156
157 virtual void setEnableFixRefinementIntoTheWall(bool enableFixRefinementIntoTheWall) = 0;
158
159 virtual void freeMemory() = 0;
160
161 virtual bool nodeInCellIs(Cell& cell, char type) const = 0;
162
164
165 virtual real getFirstFluidNode(real coords[3], int direction, real startCoord) const = 0;
166 virtual real getLastFluidNode(real coords[3], int direction, real startCoord) const = 0;
167
169 virtual void setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes) = 0;
170
171 virtual real getQValue(const uint index, const uint dir) const = 0;
172 virtual uint getQPatch(const uint index) const = 0;
173
174 virtual void setInnerRegionFromFinerGrid(bool innerRegionFromFinerGrid) = 0;
175
176 virtual void setNumberOfLayers(uint numberOfLayers) = 0;
177
178 virtual void findCommunicationIndices(int direction, SPtr<BoundingBox> subDomainBox, bool doShift) = 0;
179
180 virtual uint getNumberOfSendNodes(int direction) = 0;
181 virtual uint getNumberOfReceiveNodes(int direction) = 0;
182
183 virtual bool isSendNode(int index) const = 0;
184 virtual bool isReceiveNode(int index) const = 0;
185 virtual uint getSendIndex(int direction, uint index) = 0;
186 virtual uint getReceiveIndex(int direction, uint index) = 0;
187
188 virtual void repairCommunicationIndices(int direction) = 0;
189
190 virtual bool nodeHasBC(uint index) const = 0;
191
192 virtual std::vector<SideType> getBCAlreadySet() = 0;
193 virtual void addBCalreadySet(SideType side) = 0;
194 virtual std::vector<SideType> getADBCAlreadySet() = 0;
195 virtual void addADBCalreadySet(SideType side) = 0;
196
197
198 // needed for CUDA Streams
199 virtual void findFluidNodeIndices(bool onlyBulk) = 0;
200 virtual uint getNumberOfFluidNodes() const = 0;
201 virtual void getFluidNodeIndices(uint *fluidNodeIndices) const = 0;
202
203 virtual void findFluidNodeIndicesBorder() = 0;
205 virtual void getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const = 0;
206
207 virtual void addFluidNodeIndicesMacroVars(std::vector<uint> _fluidNodeIndicesMacroVars) = 0;
214
218 virtual void getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars) const = 0;
219 virtual void getFluidNodeIndicesApplyBodyForce(uint *fluidNodeIndicesApplyBodyForce) const = 0;
220 virtual void getFluidNodeIndicesAllFeatures(uint *fluidNodeIndicesAllFeatures) const = 0;
221};
222
223}
224
225#endif
226
virtual uint getQPatch(const uint index) const =0
virtual real getEndY() const =0
virtual real getStartZ() const =0
virtual std::vector< SideType > getBCAlreadySet()=0
virtual uint getNumberOfFluidNodeIndicesAllFeatures() const =0
virtual void setPeriodicityX(bool periodicity)=0
virtual void freeMemory()=0
virtual void transIndexToCoords(uint index, real &x, real &y, real &z) const =0
virtual void finalizeQComputation()=0
virtual bool nodeInCellIs(Cell &cell, char type) const =0
virtual void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ)=0
virtual uint getSendIndex(int direction, uint index)=0
virtual void addFluidNodeIndicesAllFeatures(std::vector< uint > _fluidNodeIndicesAllFeatures)=0
virtual void getFluidNodeIndicesBorder(uint *fluidNodeIndicesBorder) const =0
virtual void enableComputeQs()=0
virtual int getEndDirection() const =0
virtual uint getNumberOfSolidBoundaryNodes() const =0
virtual void getFluidNodeIndicesAllFeatures(uint *fluidNodeIndicesAllFeatures) const =0
virtual Vertex getMinimumOnNode(Vertex exact) const =0
virtual const std::vector< int > & getDirection() const =0
virtual void mesh(Object *object)=0
virtual bool isSendNode(int index) const =0
virtual uint getNumberOfNodesFC() const =0
virtual void enableFindSolidBoundaryNodes()=0
virtual real getEndX() const =0
virtual real getFirstFluidNode(real coords[3], int direction, real startCoord) const =0
virtual void findFluidNodeIndicesBorder()=0
virtual void getGridInterfaceIndices(uint *iCellCfc, uint *iCellCff, uint *iCellFcc, uint *iCellFcf) const =0
virtual void findQs(Object *object)=0
virtual std::vector< SideType > getADBCAlreadySet()=0
virtual uint getNumberOfFluidNodeIndicesMacroVars() const =0
virtual void setPeriodicBoundaryShiftsOnZinX(real shift)=0
virtual void addFluidNodeIndicesMacroVars(std::vector< uint > _fluidNodeIndicesMacroVars)=0
virtual int * getNeighborsX() const =0
virtual uint getNumberOfFluidNodesBorder() const =0
virtual real getDelta() const =0
virtual void repairGridInterfaceOnMultiGPU(SPtr< Grid > fineGrid)=0
virtual bool nodeHasBC(uint index) const =0
virtual void limitToSubDomain(SPtr< BoundingBox > subDomainBox)=0
virtual void mesh(TriangularMesh &geometry)=0
virtual void setPeriodicityY(bool periodicity)=0
virtual uint * getCF_fine() const =0
virtual uint getSparseSize() const =0
virtual void sortFluidNodeIndicesApplyBodyForce()=0
virtual void addBCalreadySet(SideType side)=0
virtual void setPeriodicBoundaryShiftsOnYinX(real shift)=0
virtual void setNumberOfSolidBoundaryNodes(uint numberOfSolidBoundaryNodes)=0
virtual void beginQComputation()=0
virtual bool getPeriodicityY() const =0
virtual SPtr< const Object > getObject() const =0
virtual uint getNumberOfReceiveNodes(int direction)=0
virtual int * getNeighborsY() const =0
virtual void sortFluidNodeIndicesAllFeatures()=0
virtual void sortFluidNodeIndicesMacroVars()=0
virtual void addFluidNodeIndicesApplyBodyForce(std::vector< uint > _fluidNodeIndicesApplyBodyForce)=0
virtual uint getNumberOfNodesCF() const =0
virtual void addADBCalreadySet(SideType side)=0
virtual void addAllFluidNodeIndicesToAllFeatures()=0
virtual void setPeriodicBoundaryShiftsOnZinY(real shift)=0
virtual void getFluidNodeIndicesMacroVars(uint *fluidNodeIndicesMacroVars) const =0
virtual uint getSize() const =0
virtual void repairCommunicationIndices(int direction)=0
virtual void inital(const SPtr< Grid > fineGrid, uint numberOfLayers)=0
virtual uint * getFC_coarse() const =0
virtual uint * getCF_offset() const =0
virtual int * getNeighborsZ() const =0
virtual int * getNeighborsNegative() const =0
virtual void setPeriodicityZ(bool periodicity)=0
virtual uint getReceiveIndex(int direction, uint index)=0
virtual uint * getFC_offset() const =0
virtual real getQValue(const uint index, const uint dir) const =0
virtual bool isReceiveNode(int index) const =0
virtual bool getPeriodicityX() const =0
virtual real getStartY() const =0
virtual char getFieldEntry(uint matrixIndex) const =0
virtual uint getNumberOfFluidNodeIndicesApplyBodyForce() const =0
virtual void setPeriodicBoundaryShiftsOnXinZ(real shift)=0
virtual uint getNumberOfNodesY() const =0
virtual void setFieldEntry(uint matrixIndex, char type)=0
virtual uint getNumberOfNodesX() const =0
virtual uint getNumberOfNodesZ() const =0
virtual uint * getCF_coarse() const =0
virtual uint * getFC_fine() const =0
virtual void closeNeedleCells()=0
virtual void setNumberOfLayers(uint numberOfLayers)=0
virtual void getFluidNodeIndicesApplyBodyForce(uint *fluidNodeIndicesApplyBodyForce) const =0
virtual void setInnerRegionFromFinerGrid(bool innerRegionFromFinerGrid)=0
virtual int getSparseIndex(uint matrixIndex) const =0
virtual void getFluidNodeIndices(uint *fluidNodeIndices) const =0
virtual real getLastFluidNode(real coords[3], int direction, real startCoord) const =0
virtual void closeNeedleCellsThinWall()=0
virtual void findFluidNodeIndices(bool onlyBulk)=0
virtual Vertex getMaximumOnNode(Vertex exact) const =0
virtual void getNodeValues(real *xCoords, real *yCoords, real *zCoords, uint *neighborX, uint *neighborY, uint *neighborZ, uint *neighborNegative, uint *geo) const =0
virtual void setOddStart(bool xOddStart, bool yOddStart, bool zOddStart)=0
virtual uint transCoordToIndex(const real &x, const real &y, const real &z) const =0
virtual real getEndZ() const =0
virtual void setPeriodicBoundaryShiftsOnXinY(real shift)=0
virtual void findGridInterface(SPtr< Grid > grid)=0
virtual void setEnableFixRefinementIntoTheWall(bool enableFixRefinementIntoTheWall)=0
virtual bool isStopperForBC(uint index) const =0
virtual uint getNumberOfFluidNodes() const =0
virtual void findSparseIndices(SPtr< Grid > fineGrid)=0
virtual real getStartX() const =0
virtual int getStartDirection() const =0
virtual bool getPeriodicityZ() const =0
virtual void findCommunicationIndices(int direction, SPtr< BoundingBox > subDomainBox, bool doShift)=0
virtual bool isSparseIndexInFluidNodeIndicesBorder(uint &sparseIndex) const =0
virtual real * getDistribution() const =0
virtual void setPeriodicBoundaryShiftsOnYinZ(real shift)=0
virtual uint getNumberOfSendNodes(int direction)=0
virtual ~Grid()=default
std::shared_ptr< T > SPtr
float real
Definition DataTypes.h:42
unsigned int uint
Definition DataTypes.h:47
@ z
Definition Axis.h:44
@ x
Definition Axis.h:42
@ y
Definition Axis.h:43
SideType
Definition Side.h:63