From 43b4cbf8c0649ea55c1b7cc015f5718db2ab8649 Mon Sep 17 00:00:00 2001 From: Soeren Peters <peters@irmb.tu-bs.de> Date: Fri, 20 Apr 2018 10:48:27 +0200 Subject: [PATCH] - remove fluid nodes in oddcells, which contains a out_of_grid node --- .gitignore | 1 + .../TriangularMesh/TriangularMesh.cu | 8 +--- .../TriangularMesh/TriangularMesh.h | 1 - src/GridGenerator/grid/GridImp.cu | 43 +++++++++++++++++++ src/GridGenerator/grid/GridImp.h | 4 ++ .../GridCpuStrategy/GridCpuStrategy.cpp | 11 ++++- .../GridCpuStrategy/GridCpuStrategy.h | 2 +- targets/apps/HULC/main.cpp | 3 +- 8 files changed, 62 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 6f31401f7..d87980fd0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ build/ .vscode/ +MSVC2017/ diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu index aba9b4e7e..d2d14884a 100644 --- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu +++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.cu @@ -32,15 +32,9 @@ TriangularMesh::TriangularMesh(const std::string& inputPath) this->triangleVec = STLReader::readSTL(inputPath); initalizeDataFromTriangles(); this->findNeighbors(); + this->minmax = BoundingBox::makeInvalidMinMaxBox(); } -TriangularMesh::TriangularMesh(const TriangularMesh& geo) -{ - this->triangleVec = geo.triangleVec; - this->triangles = geo.triangles; - this->size = geo.size; - this->minmax = BoundingBox(geo.minmax); -} TriangularMesh::TriangularMesh() { diff --git a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h index d5e930875..06e5bfb3d 100644 --- a/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h +++ b/src/GridGenerator/geometries/TriangularMesh/TriangularMesh.h @@ -26,7 +26,6 @@ public: VF_PUBLIC static TriangularMesh* make(const std::string& fileName, DiscretizationMethod discretizationMethod); VF_PUBLIC TriangularMesh(); - VF_PUBLIC TriangularMesh(const TriangularMesh& geo); VF_PUBLIC TriangularMesh(const std::string& inputPath); VF_PUBLIC TriangularMesh(const std::string& inputPath, const BoundingBox &box); HOSTDEVICE VF_PUBLIC ~TriangularMesh(); diff --git a/src/GridGenerator/grid/GridImp.cu b/src/GridGenerator/grid/GridImp.cu index 214254e51..9426d9578 100644 --- a/src/GridGenerator/grid/GridImp.cu +++ b/src/GridGenerator/grid/GridImp.cu @@ -85,7 +85,13 @@ HOST void GridImp::inital() else gridStrategy->findInnerNodes(shared_from_this()); + GridVTKWriter::writeSparseGridToVTK(shared_from_this(), "D:/GRIDGENERATION/pio"); + gridStrategy->findStopperNodes(shared_from_this()); + + if (triangularMesh) + GridVTKWriter::writeSparseGridToVTK(shared_from_this(), "D:/GRIDGENERATION/pio_stopper"); + } HOSTDEVICE void GridImp::initalNodeToOutOfGrid(uint index) @@ -211,6 +217,42 @@ HOSTDEVICE void GridImp::findStopperNode(uint index) this->field.setFieldEntryToStopperEndOfGrid(index); } +HOSTDEVICE void GridImp::removeOddBoundaryCellNode(uint index) +{ + Cell cell = getOddCellFromIndex(index); + if (isOutSideOfGrid(cell)) + return; + if (contains(cell, OUT_OF_GRID)) + setTo(cell, OUT_OF_GRID); +} + +HOSTDEVICE bool GridImp::isOutSideOfGrid(Cell &cell) const +{ + for (const auto point : cell) { + if (point.x < startX || point.x > endX + || point.y < startY || point.y > endY + || point.z < startZ || point.z > endZ) + return true; + } + return false; +} + +HOSTDEVICE bool GridImp::contains(Cell &cell, char type) const +{ + for (const auto point : cell) { + if (field.is(transCoordToIndex(point.x, point.y, point.z), type)) + return true; + } + return false; +} + +HOSTDEVICE void GridImp::setTo(Cell &cell, char type) +{ + for (const auto point : cell) { + field.setFieldEntry(transCoordToIndex(point.x, point.y, point.z), type); + } +} + HOSTDEVICE bool GridImp::isValidStartOfGridStopper(uint index) const { return this->field.is(index, OUT_OF_GRID) && (nodeInNextCellIs(index, FLUID) || nodeInNextCellIs(index, FLUID_CFF)); @@ -490,6 +532,7 @@ HOST void GridImp::findGridInterface(SPtr<Grid> finerGrid) HOSTDEVICE void GridImp::findGridInterfaceCF(uint index, GridImp& finerGrid) { gridInterface->findInterfaceCF(index, this, &finerGrid); + } HOSTDEVICE void GridImp::findGridInterfaceFC(uint index, GridImp& finerGrid) diff --git a/src/GridGenerator/grid/GridImp.h b/src/GridGenerator/grid/GridImp.h index 0b7ef13a5..7019158a9 100644 --- a/src/GridGenerator/grid/GridImp.h +++ b/src/GridGenerator/grid/GridImp.h @@ -34,6 +34,10 @@ private: HOSTDEVICE Cell getOddCellFromIndex(uint index) const; HOSTDEVICE bool isValidStartOfGridStopper(uint index) const; HOSTDEVICE bool isValidEndOfGridStopper(uint index) const; + HOSTDEVICE void removeOddBoundaryCellNode(uint index); + HOSTDEVICE bool isOutSideOfGrid(Cell &cell) const; + HOSTDEVICE bool contains(Cell &cell, char type) const; + HOSTDEVICE void setTo(Cell &cell, char type); HOSTDEVICE bool nodeInNextCellIs(int index, char type) const; HOSTDEVICE bool nodeInPreviousCellIs(int index, char type) const; diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp index f39d04da3..098afe419 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.cpp @@ -20,7 +20,6 @@ void GridCpuStrategy::allocateGridMemory(SPtr<GridImp> grid) { - grid->neighborIndexX = new int[grid->size]; grid->neighborIndexY = new int[grid->size]; grid->neighborIndexZ = new int[grid->size]; @@ -74,6 +73,7 @@ void GridCpuStrategy::findInnerNodes(SPtr<GridImp> grid, TriangularMesh* triangu pointInObjectMethod(grid, triangularMesh); } + removeOddBoundaryCellNodes(grid); } void GridCpuStrategy::pointUnderTriangleMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh) @@ -267,6 +267,14 @@ void GridCpuStrategy::rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* trian } } +void GridCpuStrategy::removeOddBoundaryCellNodes(SPtr<GridImp> grid) +{ +#pragma omp parallel for + for (uint index = 0; index < grid->size; index++) + grid->removeOddBoundaryCellNode(index); +} + + void GridCpuStrategy::findStopperNodes(SPtr<GridImp> grid) { #pragma omp parallel for @@ -300,6 +308,7 @@ void GridCpuStrategy::findGridInterface(SPtr<GridImp> grid, SPtr<GridImp> fineGr for (uint index = 0; index < grid->getSize(); index++) grid->findGridInterfaceCF(index, *fineGrid); + GridVTKWriter::writeSparseGridToVTK(fineGrid, "D:/GRIDGENERATION/CF"); for (uint index = 0; index < grid->getSize(); index++) grid->findGridInterfaceFC(index, *fineGrid); diff --git a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h index 1e611f6ea..3297f6079 100644 --- a/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h +++ b/src/GridGenerator/grid/GridStrategy/GridCpuStrategy/GridCpuStrategy.h @@ -41,7 +41,7 @@ protected: void pointUnderTriangleMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh); void rayCastingMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh); void pointInObjectMethod(SPtr<GridImp> grid, TriangularMesh* triangularMesh); - + void removeOddBoundaryCellNodes(SPtr<GridImp> grid); public: void allocateFieldMemory(Field* field) override; void freeFieldMemory(Field* field) override; diff --git a/targets/apps/HULC/main.cpp b/targets/apps/HULC/main.cpp index 103c82497..74aaadc3a 100644 --- a/targets/apps/HULC/main.cpp +++ b/targets/apps/HULC/main.cpp @@ -256,7 +256,8 @@ void multipleLevel(const std::string& configPath) //conglomerate->subtract(new Sphere(30, 20, 20, 4)); //gridBuilder->addGrid(conglomerate, 2); - TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_UNDER_TRIANGLE); + //TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/quadarBinaer.stl", DiscretizationMethod::POINT_IN_OBJECT); + TriangularMesh* triangularMesh = TriangularMesh::make("D:/GRIDGENERATION/STL/sphereBinary.stl", DiscretizationMethod::POINT_IN_OBJECT); //TriangularMesh* sphere = STLReader::makeTriangularMesh("D:/GRIDGENERATION/STL/circleBinaer.stl"); //TransformatorImp trans(1.0, Vertex(-30, -5, 10)); -- GitLab