diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.cpp b/src/GridGenerator/grid/BoundaryConditions/Side.cpp index 093262f6a2c898937b57954bfb03e5a78c6f7b17..413f5cb58bc09d0408f62242bdb2c5e178bde3a3 100644 --- a/src/GridGenerator/grid/BoundaryConditions/Side.cpp +++ b/src/GridGenerator/grid/BoundaryConditions/Side.cpp @@ -81,7 +81,8 @@ void Geometry::addIndices(SPtr<Grid> grid, SPtr<BoundaryCondition> boundaryCondi if (qFound) { - geometryBoundaryCondition->indices.push_back(i); + const int sparseIndex = grid->getSparseIndex(i); + geometryBoundaryCondition->indices.push_back(sparseIndex); geometryBoundaryCondition->qs.push_back(qNode); } diff --git a/src/GridGenerator/grid/BoundaryConditions/Side.h b/src/GridGenerator/grid/BoundaryConditions/Side.h index 486e04ebe60946bf59416c7b5c59efb039eed64f..0bda143c07a05861c2db47b280b271832e19ca19 100644 --- a/src/GridGenerator/grid/BoundaryConditions/Side.h +++ b/src/GridGenerator/grid/BoundaryConditions/Side.h @@ -180,6 +180,8 @@ public: return SPtr<Side>(new MZ()); case SideType::PZ: return SPtr<Side>(new PZ()); + case SideType::GEOMETRY: + return SPtr<Side>(new Geometry()); } } }; diff --git a/src/GridGenerator/grid/Field.cu b/src/GridGenerator/grid/Field.cu index 27914835602a3c92a1d5a5c04cef730d11fdb0de..9d95db80bbebf9036ec69df1715a5faddd46709b 100644 --- a/src/GridGenerator/grid/Field.cu +++ b/src/GridGenerator/grid/Field.cu @@ -103,7 +103,7 @@ HOSTDEVICE bool Field::isQ(uint index) const HOSTDEVICE bool Field::isRb(uint index) const { - return field[index] == VELOCITY || field[index] == PRESSURE || field[index] == NOSLIP || field[index] == SOLID; + return field[index] == SOLID; } // --------------------------------------------------------- // diff --git a/src/GridGenerator/grid/Grid.h b/src/GridGenerator/grid/Grid.h index c3d05b330b72af30436cc2479b92200e1fff312a..bf41f6b01d8301c40bf4982a287f1da24f75aee6 100644 --- a/src/GridGenerator/grid/Grid.h +++ b/src/GridGenerator/grid/Grid.h @@ -67,9 +67,11 @@ public: HOST virtual void inital() = 0; HOST virtual void findGridInterface(SPtr<Grid> grid) = 0; + HOST virtual void mesh(TriangularMesh& geometry) = 0; HOST virtual void mesh(Object* object) = 0; + HOST virtual void findQs(Object* object) = 0; HOST virtual void setPeriodicity(bool periodicityX, bool periodicityY, bool periodicityZ) = 0; HOST virtual void setPeriodicityX(bool periodicity) = 0; diff --git a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp index 41f5b91d42456a240fefb8ade644a141b295a3a9..9d9558077695a59791289b134803a42e399ca9d8 100644 --- a/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/LevelGridBuilder.cpp @@ -362,7 +362,7 @@ void LevelGridBuilder::getGeometryQs(real* qs[27], int level) const { for (int i = 0; i < geometryBoundaryCondition->indices.size(); i++) { - for (int dir = 0; dir < grids[level]->getEndDirection(); dir++) + for (int dir = 0; dir <= grids[level]->getEndDirection(); dir++) { qs[dir][i] = geometryBoundaryCondition->qs[i][dir]; } diff --git a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp index abe7a26b6f92cdfd710f1253a470e94d796aa979..a035c655f71e3a0fc8ddb2b10d7582d0014ddda1 100644 --- a/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp +++ b/src/GridGenerator/grid/GridBuilder/MultipleGridBuilder.cpp @@ -32,6 +32,8 @@ void MultipleGridBuilder::addCoarseGrid(real startX, real startY, real startZ, r void MultipleGridBuilder::addGeometry(Object* solidObject) { this->solidObject = solidObject; + this->geometryBoundaryCondition = GeometryBoundaryCondition::make(); + this->geometryBoundaryCondition->side = SideFactory::make(SideType::GEOMETRY); } void MultipleGridBuilder::addGeometry(Object* solidObject, uint level) @@ -253,7 +255,11 @@ void MultipleGridBuilder::buildGrids() for (auto grid : grids) grid->inital(); - //grids[grids.size()-1]->mesh(solidObject); + if (geometryBoundaryCondition) + { + grids[grids.size() - 1]->mesh(solidObject); + grids[grids.size() - 1]->findQs(solidObject); + } for (size_t i = 0; i < grids.size() - 1; i++) grids[i]->findGridInterface(grids[i + 1]); diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu index e660e1170a1cc3b30393a8f145f0f464becb6c7c..c2fffa281f58cf928d39dd388a563cbcfa6fd9c6 100644 --- a/src/GridGenerator/grid/GridImp.cu +++ b/src/GridGenerator/grid/GridImp.cu @@ -559,6 +559,56 @@ HOSTDEVICE void GridImp::mesh(Triangle &triangle) } } + + +HOST void GridImp::findQs(Object* object) +{ + TriangularMesh* triangularMesh = dynamic_cast<TriangularMesh*>(object); + if (triangularMesh) + findQs(*triangularMesh); +} + +HOST void GridImp::findQs(TriangularMesh &triangularMesh) +{ + const clock_t begin = clock(); + + gridStrategy->findQs(shared_from_this(), triangularMesh); + + const clock_t end = clock(); + const real time = (real)(real(end - begin) / CLOCKS_PER_SEC); + + *logging::out << logging::Logger::INFO_INTERMEDIATE << "time finding qs: " << time << "s\n"; +} + +HOSTDEVICE void GridImp::findQs(Triangle &triangle) +{ + auto box = this->getBoundingBoxOnNodes(triangle); + triangle.initalLayerThickness(getDelta()); + + for (real x = box.minX; x <= box.maxX; x += delta) + { + for (real y = box.minY; y <= box.maxY; y += delta) + { + for (real z = box.minZ; z <= box.maxZ; z += delta) + { + const uint index = this->transCoordToIndex(x, y, z); + if (!field.isFluid(index)) + continue; + + const Vertex point(x, y, z); + const int value = triangle.isUnderFace(point); + + if (value == Q) + { + field.setFieldEntry(index, Q); + calculateQs(point, triangle); + + } + } + } + } +} + HOSTDEVICE void GridImp::setDebugPoint(uint index, int pointValue) { if (field.isInvalid(index) && pointValue == SOLID) @@ -590,7 +640,8 @@ HOSTDEVICE void GridImp::calculateQs(const Vertex &point, const Triangle &triang //solid_node = VertexInteger(actualPoint.x + direction.x, actualPoint.y + direction.y, actualPoint.z + direction.z); distribution.f[i*size + transCoordToIndex(point.x, point.y, point.z)] = subdistance; //printf("Q%d %d: %2.8f \n", i, grid.transCoordToIndex(actualPoint), grid.d.f[index]); - } + } else + distribution.f[i*size + transCoordToIndex(point.x, point.y, point.z)] = -1.0; } } diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h index 54c35239a6a1775d42cd844d633c647399d019fa..f5aa081decd09d6ac8b63542c826399f99b3ed5f 100644 --- a/src/GridGenerator/grid/GridImp.h +++ b/src/GridGenerator/grid/GridImp.h @@ -175,6 +175,10 @@ public: HOST void mesh(TriangularMesh &geometry) override; HOSTDEVICE void mesh(Triangle &triangle); + + HOST void findQs(Object* object) override; + HOST void findQs(TriangularMesh &triangularMesh); + HOSTDEVICE void findQs(Triangle &triangle); private: HOSTDEVICE void setDebugPoint(uint index, int pointValue); HOSTDEVICE void calculateQs(const Vertex &point, const Triangle &actualTriangle) const; diff --git a/src/GridGenerator/grid/GridMocks.h b/src/GridGenerator/grid/GridMocks.h index c87bd236329200f80ce9c0831b912863de11655e..badb10cb1fc2b6f8a9279f24946b642df7669d09 100644 --- a/src/GridGenerator/grid/GridMocks.h +++ b/src/GridGenerator/grid/GridMocks.h @@ -70,6 +70,7 @@ public: void setPeriodicityX(bool periodicity) override {} void setPeriodicityY(bool periodicity) override {} void setPeriodicityZ(bool periodicity) override {} + void findQs(Object* object) override {} }; class GridStub : public GridDummy diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp index 8d55383fa68d5ca31ba74e245608f7d3ab3d762a..62bb2af88011aeb783045c8e122cf5d40945aeaa 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp @@ -76,6 +76,14 @@ void GridCpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom) grid->mesh(geom.triangles[i]); } +void GridCpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom) +{ +#pragma omp parallel for + for (int i = 0; i < geom.size; i++) + grid->findQs(geom.triangles[i]); +} + + void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) { const auto coarseLevel = grid->getLevel(1.0); diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h index 481c42ba23123c24a7ef5bf3751cef995d9ce993..c60aab8b218032b90bd85e3258295b09666e95a4 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h @@ -23,6 +23,7 @@ public: void findStopperNodes(SPtr<GridImp> grid) override; void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override; + void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override; void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) override; diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp index 6b7ee15e91723182b082fa0ac5d5d621cd3f9675..051b45a48945820821af2c4e6cbac26c983e066f 100644 --- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.cpp @@ -62,6 +62,13 @@ void GridGpuStrategy::mesh(SPtr<GridImp> grid, TriangularMesh &geom) } + +void GridGpuStrategy::findQs(SPtr<GridImp> grid, TriangularMesh &geom) +{ + +} + + void GridGpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) { copyAndFreeFieldFromGPU(grid->getField()); diff --git a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h index 7925b2be843a47fcef16415fc40f1666bbaf03f7..0850c191a03b90235f6c75bbbc1d9d3d3cc99fc6 100644 --- a/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridGpuStrategy/GridGpuStrategy.h @@ -21,6 +21,9 @@ public: void findStopperNodes(SPtr<GridImp> grid) override; void mesh(SPtr<GridImp> grid, TriangularMesh &geom) override; + void findQs(SPtr<GridImp> grid, TriangularMesh &geom) override; + + void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGrid) override; void freeMemory(SPtr<GridImp> grid) override; diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategy.h b/src/GridGenerator/grid/GridStrategy/GridStrategy.h index 6855eb6ea998d617bc5bc4b70ebad64ced4f32fa..0571a516d60ee8da5bf16031b31d6786ed9cf8e9 100644 --- a/src/GridGenerator/grid/GridStrategy/GridStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridStrategy.h @@ -25,6 +25,8 @@ public: virtual void mesh(SPtr<GridImp> grid, TriangularMesh &geom) = 0; + virtual void findQs(SPtr<GridImp> grid, TriangularMesh &geom) = 0; + virtual void findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> finerGrid) = 0; virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) = 0; diff --git a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h index e494f816f594c88a51a39cc47c748462086746d0..8852c781075bfdc0c48fc6b65994299dd206643e 100644 --- a/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h +++ b/src/GridGenerator/grid/GridStrategy/GridStrategyMocks.h @@ -32,6 +32,7 @@ public: virtual void findSparseIndices(SPtr<GridImp> coarseGrid, SPtr<GridImp> fineGrid) override {} + void findQs(SPtr<GridImp> grid, TriangularMesh& geom) override {}; }; #endif diff --git a/src/GridGenerator/grid/NodeValues.h b/src/GridGenerator/grid/NodeValues.h index 5fda00c32487345f07baa6c76101818a51ca9204..7c935abc6d18b78b4dc3a56b8846675d67b4ec0f 100644 --- a/src/GridGenerator/grid/NodeValues.h +++ b/src/GridGenerator/grid/NodeValues.h @@ -25,22 +25,7 @@ -#define Q 6 -#define NOSLIP 2 -#define PRESSURE 3 -#define VELOCITY 4 - - - - -#define RB_INLET PRESSURE -#define RB_OUTLET PRESSURE - -#define RB_FRONT NOSLIP -#define RB_BACK NOSLIP - -#define RB_BOTTOM NOSLIP -#define RB_TOP NOSLIP +#define Q 12 #endif diff --git a/src/VirtualFluids_GPU/LBM/Simulation.cpp b/src/VirtualFluids_GPU/LBM/Simulation.cpp index 928fd1f210f729e3eca7488231241a4550ef827d..de51685302c78a2a00359f3cf7f09e09f198f864 100644 --- a/src/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/VirtualFluids_GPU/LBM/Simulation.cpp @@ -1429,12 +1429,12 @@ void Simulation::run() // para->getParD(0)->neighborX_SP, para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP, // para->getParD(0)->size_Mat_SP, para->getParD(0)->evenOrOdd); //getLastCudaError("QDev27 execution failed"); - //QDevComp27( para->getParD(0)->numberofthreads, para->getParD(0)->nx, para->getParD(0)->ny, - // para->getParD(0)->d0SP.f[0], para->getParD(0)->QGeom.k, para->getParD(0)->QGeom.q27[0], - // para->getParD(0)->QGeom.kQ, para->getParD(0)->QGeom.kQ, para->getParD(0)->omega, - // para->getParD(0)->neighborX_SP, para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP, - // para->getParD(0)->size_Mat_SP, para->getParD(0)->evenOrOdd); - //getLastCudaError("QDevComp27 (Geom) execution failed"); + QDevComp27( para->getParD(0)->numberofthreads, para->getParD(0)->nx, para->getParD(0)->ny, + para->getParD(0)->d0SP.f[0], para->getParD(0)->QGeom.k, para->getParD(0)->QGeom.q27[0], + para->getParD(0)->QGeom.kQ, para->getParD(0)->QGeom.kQ, para->getParD(0)->omega, + para->getParD(0)->neighborX_SP, para->getParD(0)->neighborY_SP, para->getParD(0)->neighborZ_SP, + para->getParD(0)->size_Mat_SP, para->getParD(0)->evenOrOdd); + getLastCudaError("QDevComp27 (Geom) execution failed"); //QPressDevOld27( para->getParD(0)->numberofthreads, para->getParD(0)->QPress.RhoBC, diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp index da032a4989b034a33ca1e19a5525a2fa97a5bf5f..2047c39e257038d472eedf951e5f1db1b8231d7f 100644 --- a/targets/apps/HULC/main.cpp +++ b/targets/apps/HULC/main.cpp @@ -270,13 +270,16 @@ void multipleLevel(const std::string& configPath) ////TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT); - gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0); //gridBuilder->addGrid(new Cuboid(-10, -8, -8, 50, 22, 22), 1); - TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl"); + //gridBuilder->addCoarseGrid(-16, -14, -14, 59, 28, 29, 1.0); + //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/input/local_input/bruecke.stl"); - //gridBuilder->addGeometry(triangularMesh); + gridBuilder->addCoarseGrid(-10, -10, -10, 10, 10, 10, 0.25); + TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/cubeBinaer1x1.stl"); + + gridBuilder->addGeometry(triangularMesh); gridBuilder->setVelocityBoundaryCondition(SideType::MX, 0.001, 0.0, 0.0); gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.001); @@ -315,7 +318,7 @@ void multipleLevel(const std::string& configPath) gridBuilder->buildGrids(); //SimulationFileWriter::write("D:/GRIDGENERATION/files/", gridBuilder, FILEFORMAT::ASCII); - //gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/"); + gridBuilder->writeGridsToVtk("D:/GRIDGENERATION/");