49using namespace grid_generator;
53 std::array<real, 3> normal;
75 const uint index = getIndex(grid,
coord, constant, v1, v2);
80 if ( grid->getFieldEntry(index) == vf::gpu::FLUID
81 || grid->getFieldEntry(index) == vf::gpu::FLUID_CFC
82 || grid->getFieldEntry(index) == vf::gpu::FLUID_CFF
83 || grid->getFieldEntry(index) == vf::gpu::FLUID_FCC
84 || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF
85 || grid->getFieldEntry(index) == vf::gpu::FLUID_FCF
87 || grid->nodeHasBC(index) )
89 if(boundaryCondition->getType() != vf::gpu::BC_AD)
90 grid->setFieldEntry(index, boundaryCondition->getType());
91 boundaryCondition->indices.push_back(index);
92 setQs(grid, boundaryCondition, index);
93 boundaryCondition->setAdditionalIndices(grid, index);
94 boundaryCondition->patches.push_back(0);
102 if(boundaryCondition->getType() != vf::gpu::BC_AD)
111 std::vector<real>
qNode(grid->getEndDirection() + 1);
113 for (
int dir = 0; dir <= grid->getEndDirection(); dir++) {
115 grid->transIndexToCoords(index,
x,
y,
z);
117 std::array<real, 3>
coords = {
x,
y,
z };
133 if(boundaryCondition->getType() == vf::gpu::BC_AD)
134 resetDiagonalsInCaseOfOtherBC(grid.get(),
qNode, dir,
coords, grid->getADBCAlreadySet());
136 resetDiagonalsInCaseOfOtherBC(grid.get(),
qNode, dir,
coords, grid->getBCAlreadySet());
139 boundaryCondition->qs.push_back(
qNode);
142std::array<real, 3> Side::getNeighborCoordinates(
Grid *grid,
const std::array<real, 3> &coordinates,
size_t direction)
const
149bool Side::neighborNormalToSideIsAStopper(Grid *grid,
const std::array<real, 3> &coordinates,
SideType side)
const
156void Side::resetDiagonalsInCaseOfOtherBC(Grid *grid, std::vector<real> &
qNode,
int dir,
157 const std::array<real, 3> &coordinates,
const std::vector<SideType>&
BCAlreadySet)
const
163 if(
qNode[dir] != 0.5)
169 if (!neighborNormalToSideIsAStopper(grid, coordinates,
otherDir))
181 std::array<real, 3> normal = this->
getNormal();
223 return grid->transCoordToIndex(constant, v1, v2);
225 return grid->transCoordToIndex(v1, constant, v2);
227 return grid->transCoordToIndex(v1, v2, constant);
234 auto geometryBoundaryCondition = std::dynamic_pointer_cast<GeometryBoundaryCondition>(boundaryCondition);
235 if(geometryBoundaryCondition ==
nullptr)
236 throw std::runtime_error(
"Tried to set unallowed boundary condition on geometry");
238 std::vector<real>
qNode(grids[level]->getEndDirection() + 1);
240 for (
uint index = 0; index < grids[level]->getSize(); index++)
242 if (grids[level]->getFieldEntry(index) != vf::gpu::BC_SOLID)
245 for (
int dir = 0; dir <= grids[level]->getEndDirection(); dir++)
247 const real q = grids[level]->getQValue(index, dir);
253 grids[level]->transIndexToCoords( index,
x,
y,
z );
255 x += grids[level]->getDirection()[dir *
DIMENSION + 0] * grids[level]->getDelta();
256 y += grids[level]->getDirection()[dir *
DIMENSION + 1] * grids[level]->getDelta();
257 z += grids[level]->getDirection()[dir *
DIMENSION + 2] * grids[level]->getDelta();
261 if(
qNode[dir] < -0.5 && ( grids[level]->getFieldEntry(
neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID_BOUNDARY ||
262 grids[level]->getFieldEntry(
neighborIndex) == vf::gpu::STOPPER_OUT_OF_GRID ||
263 grids[level]->getFieldEntry(
neighborIndex) == vf::gpu::STOPPER_SOLID ) )
267 geometryBoundaryCondition->indices.push_back(index);
268 geometryBoundaryCondition->qs.push_back(
qNode);
269 geometryBoundaryCondition->patches.push_back(grids[level]->getQPatch(index));
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
virtual real getEndY() const =0
virtual real getStartZ() const =0
virtual const std::vector< int > & getDirection() const =0
virtual real getEndX() const =0
virtual real getFirstFluidNode(real coords[3], int direction, real startCoord) const =0
virtual real getDelta() const =0
virtual bool getPeriodicityY() const =0
virtual bool getPeriodicityX() const =0
virtual real getStartY() const =0
virtual char getFieldEntry(uint matrixIndex) const =0
virtual real getLastFluidNode(real coords[3], int direction, real startCoord) const =0
virtual uint transCoordToIndex(const real &x, const real &y, const real &z) const =0
virtual real getEndZ() const =0
virtual real getStartX() const =0
virtual bool getPeriodicityZ() const =0
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
void addIndices(const std::vector< SPtr< Grid > > &grid, uint level, SPtr< grid_generator::BoundaryCondition > boundaryCondition) override
const std::map< SideType, size_t > sideToD3Q27
virtual int getDirection() const =0
size_t getD3Q27Direction() const
virtual bool isAlignedWithMyNormal(const Grid *grid, int dir) const
virtual void correctNeighborForPeriodicBoundaries(const Grid *grid, std::array< real, 3 > &coords, std::array< real, 3 > &neighbors) const
virtual int getCoordinate() const =0
void setQs(SPtr< Grid > grid, SPtr< grid_generator::BoundaryCondition > boundaryCondition, uint index)
virtual SideType whoAmI() const =0
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
std::array< real, 3 > getNormal() const
bool isAlignedWithNormal(const Grid *grid, int dir, const std::array< real, 3 > &normal) const
std::shared_ptr< T > SPtr